3

我读过很多文章,描述人们如何使用 AVAssetReader 或 AVPlayerItemVideoOutput 从视频文件中获取视频帧作为原始像素数据,然后他们使用这些数据上传到 OpenGL 纹理。但是,这似乎创建了使用 CPU(而不是显卡)解码视频帧的不必要步骤,以及创建不必要的像素数据副本。

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

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

初始化:

  • 打开电影文件,提供 opengl 上下文;
  • 获取opengl纹理ID;

每个opengl循环:

  • 绘制纹理ID;
4

1 回答 1

1

如果您要Video Decode Acceleration Framework在 OS X 上使用,它会CVImageBufferRef在您“显示”解码帧时为您提供一个,您可以调用CVOpenGLTextureGetName (...)它作为 OpenGL 软件中的本机纹理句柄。

这当然比您的问题低,但对于某些视频格式绝对是可能的。这是我个人经验的唯一技术。但是,我相信QTMovie在更高级别上也具有类似的功能,并且可能会提供您正在寻找的全部功能。

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

于 2013-08-29T03:57:07.197 回答