OSX 上的 AVFoundation:来自视频的 OpenGL 纹理,无需访问像素数据
Posted
技术标签:
【中文标题】OSX 上的 AVFoundation:来自视频的 OpenGL 纹理,无需访问像素数据【英文标题】:AVFoundation on OSX: OpenGL texture from video WITHOUT needing access to pixel data 【发布时间】:2013-08-29 02:47:34 【问题描述】:我读过很多文章,描述人们如何使用 AVAssetReader 或 AVPlayerItemVideoOutput 从视频文件中获取作为原始像素数据的视频帧,然后将其上传到 OpenGL 纹理。但是,这似乎创建了使用 CPU(而不是显卡)解码视频帧的不必要步骤,以及创建不必要的像素数据副本。
有没有办法让 AVFoundation 拥有视频播放过程的所有方面,但也提供了对其创建的 OpenGL 纹理 ID 的访问,可以根据需要将其绘制到 OpenGL 上下文中?有没有人遇到过这样的事情?
换句话说,类似这样的伪代码:
初始化:
打开电影文件,提供 opengl 上下文; 获取opengl纹理ID;每个opengl循环:
绘制纹理ID;【问题讨论】:
【参考方案1】:如果您要在 OS X 上使用 Video Decode Acceleration Framework
,它会在您“显示”解码帧时为您提供 CVImageBufferRef
,您可以调用 CVOpenGLTextureGetName (...)
以在 OpenGL 软件中用作本机纹理句柄.
这当然比您的问题要低,但对于某些视频格式绝对是可能的。这是我个人经验的唯一技术。不过,我相信QTMovie
也具有更高级别的类似功能,并且可能会提供您正在寻找的全部功能。
我希望我能对 AVFoundation 发表评论,但自 10.6 以来我还没有在 OS X 上做过任何开发工作。我想这个过程应该是类似的,它应该分层在 CoreVideo 之上。
【讨论】:
我似乎找不到您所说的 QTMovie 功能。我的应用程序需要以 64 位运行,所以您所指的可能仅适用于 32 位。你有任何进一步的信息吗? @MusicMan3001:看看这个cimgf.com/2008/09/10/…我想它会解释你需要知道的一切。 谢谢 Andon,我确实看过那个页面,但我相信它描述的 API 不仅已被弃用,而且在 64 位中也不起作用。谁能确认一下?以上是关于OSX 上的 AVFoundation:来自视频的 OpenGL 纹理,无需访问像素数据的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa:来自原始数据的 AVAsset(即 NSData)
来自 AVFoundation 的 iPhone 5 视网膜显示纵横比