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 视网膜显示纵横比

AVFoundation 或 MPMoviePlayerViewController ios 中的快速视频浏览

AVFoundation 将第一帧添加到视频

HDMI 视频到 iOS 设备

使用 AVFoundation 在 iOS 上录制音频样本