OSF上的AVFoundation:视频中的OpenGL纹理无需访问像素数据

问题描述:

我已阅读大量文章描述人们如何使用AVAssetReader或AVPlayerItemVideoOutput将视频帧作为原始像素数据从视频文件中获取,然后将它们用于上传到OpenGL纹理。然而,这似乎造成了用CPU(与图形卡相对)解码视频帧的不必要的步骤,以及创建不必要的像素数据副本。OSF上的AVFoundation:视频中的OpenGL纹理无需访问像素数据

有没有办法让AVFoundation拥有视频播放过程的所有方面,但不知何故,它还提供对其创建的OpenGL纹理ID的访问,可以根据需要将其绘制到OpenGL上下文中?有没有人遇到过这样的事情?

换句话说,像这样的伪代码:

初始化:

  • 打开电影文件,提供OpenGL上下文;
  • get opengl texture id;

每OpenGL的循环:

  • 平局质感ID;

如果你要在OS X上使用Video Decode Acceleration Framework,它会给你一个CVImageBufferRef当你“显示”解码帧,您可以致电在OpenGL的软件原生材质手柄使用CVOpenGLTextureGetName (...)

这当然是低于您的问题的水平,但它绝对有可能对某些视频格式。这是我亲身体验过的唯一技术。不过,我相信QTMovie在更高层次上也具有相似的功能,并且可能会提供您正在寻找的全部功能。

我希望我可以对AVFoundation发表评论,但自10.6以来,我还没有在OS X上做过任何开发工作。我想这个过程应该是相似的,但它应该在CoreVideo之上进行分层。

+0

我似乎无法找到您所说的QTMovie功能。我的应用程序需要运行在64位,所以也许你所指的只适用于32位。你有更多的信息吗? – MusicMan3001

+0

@ MusicMan3001:看看这个http://www.cimgf.com/2008/09/10/core-animation-tutorial-rendering-quicktime-movies-in-a-caopengllayer/我想它会解释你需要的一切知道。 –

+0

感谢Andon,我已经看到了那个页面,但我相信它描述了一个不仅被弃用的API,而且不能用于64位。有人可以确认吗? – MusicMan3001