【问题标题】:How do I render frames from FFmpeg to the screen in an iOS app?如何在 iOS 应用程序中将帧从 FFmpeg 渲染到屏幕?
【发布时间】:2011-12-21 04:52:51
【问题描述】:

我是 iOS 新手,但我已经在 Android 上实现了一个基于 FFmpeg 的播放例程。我打算在 iOS 上再做一次。

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

有没有更简单的方法在 iOS 上使用 OpenGL ES 渲染此视频?有没有其他方法可以在 iOS 中快速将 2-D 视频帧绘制到屏幕上?

【问题讨论】:

  • 连续是什么意思?而且,为什么要“将整个视频图像分割成许多纹理并将它们绘制为‘一个’”,而不是一次绘制整个图像?
  • 我试着解释一下。我使用“连续”,因为播放应该经常更新视频图像。它通常高达 30 fps(某些视频大于 30 fps)。 OpenGL-ES 可以做到最好的性能,但我对我们来说有点难。我希望将许多解决方案与我们的团队进行比较。也许'不断'说,“表演被接受”
  • 纹理的宽度应该是2的幂。例如,视频大小为 640x480,它们不是 2 的幂。我应该拆分它以适应不同的纹理大小。
  • 好的,我已经添加了答案。如果有帮助,请编辑您的问题以更好地反映您遇到的问题。
  • 所有现代 iOS 设备都支持非二次幂纹理,即使在 OpenGL ES 1.1 中(2.0 在默认规范中支持 NPOT):stackoverflow.com/a/4761453/19679 仅适用于 iPhone 3G 之前的型号S(iPhone、iPhone 3G 以及第一代和第二代 iPod touch)不支持这个扩展,它们只是当今 iOS 设备的一小部分。

标签: iphone ios opengl-es


【解决方案1】:

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

//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 作为纹理坐标。

【讨论】:

  • 感谢您的反馈。我有一个非常重要的术语“非 POT”:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多