在iOS上使用CoreMedia.framework解码视频

5

我需要在iOS应用程序中使用OpenGL解码mp4文件并将其绘制出来。 我需要从mp4文件中提取和解码h264帧,我听说可以使用CoreMedia实现此目的。 有人知道如何做吗?有使用CoreMedia的示例吗?

1个回答

9
你需要的不是Core Media,而是AVFoundation。具体而言,您可以使用AVAssetReader从电影中加载并迭代帧。然后,您可以通过使用glTexImage2D()或(在iOS 5.0上)使用速度更快的纹理缓存将这些帧作为OpenGL ES纹理上传。如果您不想自己实现此功能,我在我的GPUImage框架中使用基于AVFoundation的电影加载和处理通过OpenGL ES工作。 GPUImageMovie类封装了电影读取和上传到纹理的过程。如果您想提取该纹理以在自己的场景中使用,则可以将GPUImageTextureOutput链接到它。这些类的示例可以在框架分发中的SimpleVideoFileFilter和CubeExample示例应用程序中找到。您可以直接使用此功能,也可以查看我编写的执行GPUImageMovie类中相同操作的代码。

我尝试使用AVAssetReader,当我尝试播放一个长文件时它运行良好,但我需要播放从服务器下载的一系列小视频文件。这是我自己实现的HTTP Live流媒体。我尝试播放一个文件,创建新的读取器并播放下一个文件,但AVAsset/AVAssetReader初始化需要一些时间,我在片段之间有延迟。我考虑将新的mp4文件附加到第一个文件,但我找不到正确的方法来做到这一点。你有任何想法如何做吗?或者如何优化AVAsset/AVAssetReader的启动? - Sergey Zenchenko
我也使用了你的GPUImage库来实现一些视频特效。感谢你的出色工作,伙计! - Sergey Zenchenko
抱歉,我还没有尝试过像您描述的多个电影输入。我观察到,AVFoundation 的许多功能似乎都是围绕播放或录制单个媒体文件而设计的,而不是多个文件。 - Brad Larson
3
看一下AVComposition。它是AVAsset的子类,支持多个序列文件。 - Trenskow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接