AVSampleBufferDisplayLayer的快照

我有一些AVsampleBufferDisplayLayer上显示的video,想要捕捉这个图像并保存到相册。 由于AVSampleBufferDisplayLayerinheritance自CALayer,所以我认为在renderInContext中使用它是可以接受的。

[targetView.layer addSublayer:avLayer]; UIGraphicsBeginImageContext(targetView.bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); [avLayer renderInContext:context]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); 

但是这会导致一个空白的白色图像被保存到相册中。 任何想法,我可能会出错?

对于如何使当前的工作方式没有任何build议,但正确的方法是使用AVSampleBufferDisplayLayer,而不是使用VideoToolbox的VTDecompressionSession来解码H.264帧,并将其作为CVPixelBuffers传回给您在callback中,您可以将其转换并保存到磁盘。

我努力了一个星期左右,但最终通过从AVSampleDisplayLayer切换到VTDecompressionSession来解决这个问题。 在VTDecompression didDecompresscallback方法中,我将解压缩后的图像(CVImageBufferRef)发送到以下方法获取videostream的屏幕截图并将其转换为UIImage。

 -(void) screenshotOfVideoStream:(CVImageBufferRef)imageBuffer { CIImage *ciImage = [CIImage imageWithCVPixelBuffer:imageBuffer]; CIContext *temporaryContext = [CIContext contextWithOptions:nil]; CGImageRef videoImage = [temporaryContext createCGImage:ciImage fromRect:CGRectMake(0, 0, CVPixelBufferGetWidth(imageBuffer), CVPixelBufferGetHeight(imageBuffer))]; UIImage *image = [[UIImage alloc] initWithCGImage:videoImage]; [self doSomethingWithOurUIImage:image]; CGImageRelease(videoImage); } 

我不知道为什么VTD将支持截图,但AVSampleLayer不会。 似乎它可能是一个错误/苹果的一部分错误?