如何在 iOS 中使用 OpenGL 播放视频?
How to play Video using OpenGL in iOS?
我正在尝试在 iOS 中使用 OpenGL ES 2.0 播放视频。我无法获得示例代码或如何实现此目的的起点。有人可以帮我解决这个问题吗?
您正在寻找的是实时获取视频的原始缓冲区。我相信您需要查看 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
更新纹理(注意线程)
- 将数据加载到纹理后,将纹理绘制为全屏矩形(注意线程)
您可能需要注意视频方向、转换。因此,如果可能,请使用设备上不同方向录制的一些视频来测试您的系统。我认为现在支持接收已经正确定向的缓冲区。但默认情况下,样本至少曾经是 "wrong";纵向录制的视频仍然有横向样本,但资产给出了转换矩阵或方向。
我正在尝试在 iOS 中使用 OpenGL ES 2.0 播放视频。我无法获得示例代码或如何实现此目的的起点。有人可以帮我解决这个问题吗?
您正在寻找的是实时获取视频的原始缓冲区。我相信您需要查看 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
更新纹理(注意线程) - 将数据加载到纹理后,将纹理绘制为全屏矩形(注意线程)
您可能需要注意视频方向、转换。因此,如果可能,请使用设备上不同方向录制的一些视频来测试您的系统。我认为现在支持接收已经正确定向的缓冲区。但默认情况下,样本至少曾经是 "wrong";纵向录制的视频仍然有横向样本,但资产给出了转换矩阵或方向。