1

我正在尝试从多个视频文件中解码帧,并将它们用作 opengl 纹理。

我知道如何使用 AVAssetReader 对象解码 h264 文件,但似乎你必须startReadingwhile循环调用statusis时读取帧AVAssetReaderStatusReading。我想做的是打电话,startReading然后copyNextSampleBuffer随时随地打电话。通过这种方式,我可以从 AVAssetReader 创建一个新的视频阅读器类,并在我想将它们用作 opengl 纹理时从多个视频文件中加载视频帧。

这是可行的吗?

4

1 回答 1

0

简短的回答是肯定的,您可以一次解码一帧。您需要自己管理解码逻辑,最简单的方法是分配一个 BGRA 像素缓冲区,然后将帧缓冲区数据复制到临时缓冲区中。请注意,您可能无法找到完成所有这些操作的小代码片段。问题是,将电影中的所有数据流式传输到 OpenGL 中并不容易实现。我建议您避免尝试自己执行此操作,并使用已经实现了困难的第 3 方库。如果您想查看已经实现的类似这样的完整示例,那么您可以查看我的博客文章Load OpenGL textures with alpha channel on iOS. 这篇文章展示了如何将视频流式传输到 OpenGL,但您需要先使用这种方法从 h.264 解码到磁盘。也应该可以使用其他库来做同样的事情,请记住同时播放多个视频是资源密集型的,因此您可能会遇到硬件设备上可以快速完成的操作的限制。此外,如果您实际上不需要 OpenGL 纹理,那么直接在 iOS 下对 CoreGraphics API 进行操作会容易得多。

于 2015-11-21T19:04:23.697 回答