如何在iOS中使用OpenGL播放视频?

时间:2016-10-18 07:53:12

标签: ios opengl-es video-streaming

我正在尝试使用iOS中的OpenGL ES 2.0播放视频。我无法获得示例代码或如何实现此目的的起点。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

您正在寻找的是实时获取视频的原始缓冲区。我相信你需要调查AVFoundation并以某种方式提取CVPixelBufferRef。如果我没记错的话你会有几种方法;一个是在特定时间点播,另一个是处理,你将在一个块中快速迭代帧,你可能需要的是实时接收帧。因此,您可以提取原始RGB缓冲区,该缓冲区需要被推送到纹理,然后绘制到渲染缓冲区。

我建议您创建一次纹理(每个视频),并尝试尽可能小,但要确保视频帧适合。您可能需要POT(2的幂)纹理,以便从视频宽度获得纹理尺寸,如下所示:

GLInt textureWidth = 1.0f;
while(textureWidth<videoWidth) textureWidth <<= 1; // Multiplies by 2

因此预计纹理尺寸会比视频大。要将数据推送到纹理,您需要使用纹理子图像glTexSubImage2D。这需要指向原始数据和矩形参数的指针,以保存数据,然后(0, 0, sampleWidth, sampleHeight)。此外,必须计算纹理坐标,使它们不在[0,1]的范围内,而是x[0, sampleWidth/textureWidth]

那么你只需要把它们放在一起:

  • 让系统继续生成视频原始样本缓冲区
  • 生成适合视频大小的纹理
  • 在新样本上使用glTexSubImage2D更新纹理(注意线程)
  • 将数据加载到纹理后,将纹理绘制为全屏矩形(注意线程)

您可能需要注意视频定位,转换。因此,如果可能的话,请使用以不同方向记录在设备上的一些视频来测试您的系统。我认为现在有一种支持来接收已经正确定位的缓冲区。但默认情况下,样本至少曾经是错误的&#34 ;;肖像录制的视频仍然具有横向样本,但是资产给出了变换矩阵或方向。