繁体   English   中英

将电影中的帧绘制到CGBitmapContext中

[英]Drawing frames from a movie into a CGBitmapContext

我有一个应用程序,需要使用任意CGAffineTransform将视频/电影中的帧渲染到CGBitmapContext中。 我希望它有一个不错的帧速率,至少20fps。

我尝试使用AVURLAsset和[AVAssetImageGenerator copyCGImageAtTime:],并且该方法的文档明确指出,它的运行速度非常慢,有时会降低到5fps。

有什么更好的方法可以做到这一点? 我认为我可以使用AVPlayerLayer设置一个AVPlayer,然后在我的转换中使用[CGLayer renderInContext:]。 这行得通吗? 还是当AVPlayerLayer注意到屏幕上没有显示它时,它是否不运行?

还有其他建议吗?

我最终通过以下方法从视频帧中获得了可爱,快速的UIImage:
1)使用视频的URL创建一个AVURLAsset。
2)使用资产创建一个AVAssetReader。
3)设置读者的timeRange属性。
4)使用资产的第一条轨道创建AVAssetReaderTrackOutput。
5)将输出添加到阅读器。

然后对于每个帧:
6)调用[输出copyNextSampleBuffer]。
7)将样本缓冲区传递到CMSampleBufferGetImageBuffer。
8)将图像缓冲区传递到CVPixelBufferLockBaseAddress,只读
9)使用CVPixelBufferGetBaseAddress获取图像缓冲区的基地址
10)从图像缓冲区中调用带有尺寸的CGBitmapContextCreate,将基址作为CGBitmap像素的位置。
11)调用CGBitmapContextCreateImage以获取CGImageRef。

我非常高兴地发现这对于擦洗效果非常好。 如果用户想返回视频的较早部分,只需使用新的时间范围创建一个新的AVAssetReader即可。 相当快!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM