我正在尝试解码多个视频文件中的帧,并将它们用作opengl纹理。
我知道如何使用AVAssetReader对象解码h264文件,但是当startReading
为{{while
时,您在status
循环中调用AVAssetReaderStatusReading
后必须阅读这些帧1}}。我想要做的是拨打startReading
,然后随时随地拨打copyNextSampleBuffer
。通过这种方式,我可以从AVAssetReader创建一个新的视频阅读器类,并且只要我想将它们用作opengl纹理,就可以从多个视频文件中加载视频帧。
这可行吗?
答案 0 :(得分:0)
简短回答是肯定的,您可以一次解码一帧。您需要自己管理解码逻辑,最简单的方法是分配BGRA像素的缓冲区,然后将帧缓冲区数据复制到临时缓冲区中。请注意,您可能无法找到执行此操作的小代码snippit。事实上,将电影中的所有数据流式传输到OpenGL并不容易实现。我建议你自己避免尝试这样做并使用已经实现了硬件的第三方库。如果您想查看已经实现的类似内容的完整示例,那么您可以查看我的博客帖子Load OpenGL textures with alpha channel on iOS。这篇文章展示了如何将视频流式传输到OpenGL,但您需要先使用这种方法从h.264解码到磁盘。还应该可以使用其他库来执行相同的操作,请记住,同时播放多个视频是资源密集型的,因此您可能会遇到可以快速在硬件设备上执行的操作的限制。此外,如果您实际上不需要OpenGL纹理,那么直接在iOS下运行CoreGraphics API要容易得多。