iOS4: 我该如何将视频文件用作OpenGL纹理?

24

我正在尝试将视频文件的内容(暂时不考虑音频)显示在OpenGL中的UV贴图3D对象上。我在OpenGL方面做了很多工作,但不知道从哪里开始处理视频文件,并且大部分示例似乎是用于从摄像机获取视频帧,而这不是我想要的。

目前,我感觉如果我能将视频的单独帧作为CGImageRef获取,那就没有问题了,所以我想知道如何做到这一点?也许还有更好的方法?我应该从哪里开始,iOS上最简单的视频播放文件格式是什么? .mov?

2个回答

33

很抱歉,我正在使用iPhone打字,所以我的回答可能有点简短。

使用视频的URL(如果您喜欢,可以是本地文件URL)创建AVURLAsset。 QuickTime可以做任何事情,因此H.264格式的MOV或M4V可能是最好的来源。

查询具有AVMediaTypeVideo类型的轨道的资产。除非您的源视频具有多个摄像机角度之类的东西,否则您应该只会得到一个,因此仅获取objectAtIndex:0即可获得所需的AVAssetTrack。

使用它来创建AVAssetReaderTrackOutput。您可能想指定kCVPixelFormatType_32BGRA。

使用资产创建AVAssetReader;将资产读取器跟踪输出附加为输出。并调用startReading。

从现在开始,您可以在跟踪输出上调用copyNextSampleBuffer以获取新的CMSampleBuffers,这使您处于与从相机输入相同的位置。因此,您可以锁定该内容以获取像素内容,并通过苹果的BGRA扩展将其推送到OpenGL。


还有,谢谢。这一切都完美地运作,你可以获得非常高的FPS(取决于视频数据速率)。 - Mike Weller
另外谢谢。这对我也很有效。只需注意,您必须自行处理视频播放的帧速率同步。 - Chris Miles
我创建了一个示例,基于http://www.raywenderlich.com/4404/opengl-es-2-0-for-iphone-tutorial-part-2-textures,加载了一个带有alpha通道的OpenGL ES 2.0纹理,但使用了一个动画鱼而不是静态图像,链接在这里http://iosgraphicsanimation.wordpress.com/2013/06/15/load-opengl-textures-with-alpha-channel-on-ios/。对于24BPP视频,使用AVAsset是可以的,但是使用该方法无法使用带有alpha通道的32BPP数据。 - MoDJ
这对带有 alpha 通道的电影适用吗?mov 格式支持哪些编解码器可以实现这一点? - jowie
Jowie,你可以点击我上面评论中的链接,了解如何加载带有 alpha 通道的视频。当然,这对于 h.264 格式的视频是不起作用的,因为它不支持 alpha 通道。 - MoDJ
有人成功在OpenGL下播放iOS视频了吗?如果是的话,能否分享一下代码?我还没有成功:( 预先感谢您! - zeus

-1

你可能需要使用播放器层并将其内容压缩成位图上下文。请参阅AVPlayerLayer的文档。但是性能可能非常差。


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