[英]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.