iOS视频播放



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

这里的主要问题:

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

现在我正在做下一件事:

  • 我将视频拆分为 JPG 帧
  • 创建每秒N次的计时器(播放速度控制)
  • 每个计时器滴答作响,使用 OpenGL 绘制新纹理(下一个 JPG 帧)
  • 用于使用 OpenGL ES 转换进行缩放和平移 IM(平移、缩放)

在我使用 320*240 像素之前,一切看起来都很好,但如果我使用 512*512 像素,我的播放率就会下降。也许是计时器行为问题,也许是OpenGL。有时,如果我尝试打开具有高播放速率(超过 10-15 FPS)的大纹理,应用程序只会崩溃并显示内存警告。

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

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

您无需为此而烦恼Cocos 2d或任何游戏引擎。 我强烈建议对OpenGL ES 2.0和着色器进行一些实验。 将 OpenGL 用于视频非常简单明了,将游戏引擎添加到混合中是不必要的开销和抽象。

将图像数据上传到纹理时,不要每帧都创建新纹理。相反,创建两个纹理:一个用于亮度,一个用于色度数据,并且只需在每一帧中重复使用这些纹理。 我怀疑您的内存问题是由于每帧使用许多图像和新纹理并且可能没有删除旧纹理引起的。

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

但是等等!还有更多。

Cocos2D主要通过对精灵表的大力支持来帮助您。

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

Vlad,简短的回答是,您可能永远无法同时获得列出的所有这些功能。以 1024 FPS 播放 1024 x 60 视频真的会很困难,我非常怀疑 iOS 硬件是否能够以 60FPS 的速度跟上这种数据传输速率。即使是设备上的h.264硬件也只能在1080p下做30FPS。这可能是可能的,但是要在视频上分层图形渲染,并且还期望能够同时编辑亮度/对比度,

这同时太多了。

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

最新更新