iOS视频播放

时间:2012-08-06 15:19:23

标签: ios performance ipad video opengl-es

在我的应用程序中,我应该以不寻常的方式播放视频。 像特殊用途的交互式播放器。

主要问题:

  • 视频分辨率可以是200 * 200px到1024 * 1024 px
  • 我应该能够将速度从-60 FPS改为60 PFS(在这种情况下,视频应该根据所选速度播放得更慢或更快,负视意味着视频应该向后播放)
  • 我应该在视频上绘制线条和对象,并使用图像进行缩放。
  • 我应该有能力缩放图像并在其内容超过屏幕尺寸时平移它
  • 我应该能够改变此视频的亮度,对比度和反转颜色

现在我正在做下一件事:

  • 我将视频分割为JPG帧
  • 每秒N次创建计时器(播放速度控制)
  • 每个计时器勾选我用OpenGL绘制新纹理(下一个JPG帧)
  • 用于缩放和平移播放OpenGL ES转换(翻译,缩放)

所有看起来都很好,直到我使用320 * 240像素,但如果我使用512 * 512px,我的播放率会下降。也许计时器行为问题,也许是OpenGL。有时,如果我试图打开具有高播放速率(超过10-15 FPS)的大纹理,应用程序只会因内存警告而崩溃。

解决此问题的最佳做法是什么?我应该挖什么方向?也许cocos2d或其他游戏引擎可以帮助我? Mb JPG不是纹理的最佳解决方案,我应该使用PNG或PVR或其他?

3 个答案:

答案 0 :(得分:2)

将视频数据保存为视频,然后使用AVAssetReader获取原始帧。使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange作为颜色空间,并在GLES中进行YUV-> RGB颜色空间转换。这意味着在内存中保留较少的数据,并使您的图像处理更加简单(因为您将使用亮度和色度数据而不是RGB值)。

你不需要为Cocos 2d或任何游戏引擎而烦恼。我强烈建议您尝试使用OpenGL ES 2.0和着色器。使用OpenGL进行视频非常简单明了,在混合中添加游戏引擎是不必要的开销和抽象。

将图像数据上传到纹理时,不要每帧都创建新纹理。相反,创建两个纹理:一个用于亮度,一个用于色度数据,并且每帧只重复使用这些纹理。我怀疑你的记忆问题是由于每帧都使用了很多图像和新纹理,而且可能没有删除旧纹理。

答案 1 :(得分:1)

解压缩JPEG帧的成本非常高。第一步:使用PNG。

但是等等!还有更多。

Cocos2D可以通过great support for sprite sheets帮助您。

然而,最大的帮助可能来自包装纹理la TexturePacker。使用PVR.CCZ压缩可以加速疯狂的数量,足以让您在更大的视频尺寸下获得更好的帧速率。

答案 2 :(得分:1)

弗拉德,简短的回答是,您可能永远无法同时获得列出的所有这些功能。以60 FPS播放视频1024 x 1024视频实际上是一个延伸,我非常怀疑iOS硬件将能够跟上60FPS的那种数据传输速率。即使设备上的h.264硬件也只能在1080p下完成30FPS。这可能是可能的,但是然后在视频上对图形进行图层渲染并且还希望能够同时编辑亮度/对比度,这同时也是太多的事情。

您应该专注于实际可行的内容,而不是尝试执行每项功能。如果您想查看将iPad硬件推向极限的示例Xcode应用程序,请查看我的Fireworks示例项目。此代码同时在屏幕上显示多个已解码的h.264视频。该实现是围绕CoreGraphics API构建的,但关键在于,由于零复制优化,Apple将纹理上传到OpenGL的速度非常快。通过这种方法,可以将大量视频流式传输到设备。