如何在iOS应用中将帧从FFmpeg渲染到屏幕?

问题描述:

我是iOS的新手,但我在Android上实现了基于FFmpeg的播放例程。我打算在iOS上再次执行此操作。如何在iOS应用中将帧从FFmpeg渲染到屏幕?

看来我可以使用OpenGL ES 1.1/2.0将帧从FFmpeg视频画到屏幕上。但是,OpenGL ES似乎很难。另外,由于视频纹理的宽度,我遇到了一些限制。我不得不将视频帧分成许多图像,并将它们绘制到屏幕上以组成帧。

是否有更简单的方法在iOS上使用OpenGL ES呈现此视频?有没有其他方法可以在iOS中快速绘制2-D视频帧?

+0

你是什么意思?而且,为什么“将整个视频图像分割为多个纹理并将它们绘制为”一个“”,而不是一次绘制整个图像? – appas 2011-12-19 15:10:57

+0

我尝试解释它。我使用'连续',因为播放应该频繁更新视频图像。它通常高达30 fps(某些视频大于30 fps)。 OpenGL-ES可以做到最好的性能,但我对我们很难受。我希望将许多解决方案与我们的团队进行比较也许“连续”说,“性能是根据” – qrtt1 2011-12-19 15:16:44

+0

纹理的宽度应该是2的幂。 例如,视频尺寸为640x480,它们不是2的幂。 我应该将其分割以适应不同的纹理尺​​寸。 – qrtt1 2011-12-19 17:07:57

啊。所以你想渲染一个非POT源。这可以在不分割为多个纹理的情​​况下完成 - 通过创建最接近的POT大小的纹理,对其进行渲染并仅传输实际包含图像的部分。 查看示例(C++)here。相关部分:

//Calculating the texture size 
double exp = ceil(log((double)max(Texture.HardwareHeight, Texture.HardwareWidth))/log(2.0)); 
texsize = min(pow(2, exp), (double)maxSize); 

然后

//draw the original frame 1:1 into the (larger) texture 
float ymax = min(2.0f*((float)Texture.HardwareHeight/(float)texsize) - 1.0f, 1.0f);  //clamping is for cards with 
float xmax = min(2.0f*((float)Texture.HardwareWidth/(float)texsize) - 1.0f, 1.0f);  //smaller max hardware texture than the current frame size 

当作为纹理坐标绘制时使用的1.0这些最大值来代替。

+0

感谢您的反馈。我有一个非常重要的术语'non-POT':D – qrtt1 2011-12-21 07:14:57