0

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

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

有什么更好的方法来做到这一点?我想我可以使用 AVPlayerLayer 设置 AVPlayer,然后将 [CGLayer renderInContext:] 与我的转换一起使用。这行得通吗?或者当 AVPlayerLayer 注意到它没有显示在屏幕上时,它可能不会运行?

还有什么方法可以推荐吗?

4

1 回答 1

1

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

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

我很高兴地发现这对于擦洗效果非常好。如果用户想回到视频的较早部分,只需创建一个具有新时间范围的新 AVAssetReader 并继续。它相当快!

于 2014-04-05T05:23:01.693 回答