2012-08-06 289 views
2

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

主要问题:

  • 视频分辨率可以从200 * 200像素高达1024 * 1024像素
  • 我应该从-60 FPS改变速度,以60 PFS(在这种情况下,视频的能力应该根据选定的速度播放更慢或更快,负面意味着视频应向后播放)
  • 我应该在视频上绘制线条和对象,并使用图像进行缩放。
  • 我应该有能力放大图像,如果平移它的内容超过屏幕大小
  • 我应该改变这种视频

现在我正在做下一件事的亮度,对比度和反转颜色的能力:

  • 我splited我的视频帧JPG
  • 为每秒N次(播放速度控制)
  • 每个计时器滴答IM d创建计时器用OpenGL rawing新的纹理(下一JPG帧)
  • 的缩放和平移IM使用OpenGL ES变换(平移,缩放)打

一切看起来很正常,直到我用320 * 240像素,但如果我使用512 * 512px我的播放速度正在下降。也许定时器行为问题,可能是OpenGL。有时候,如果我试图以高播放速度(超过10-15 FPS)打开大纹理,应用程序会因为内存警告而崩溃。

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

+1

为什么要转换为任何类型的图像?为什么不把原始帧作为纹理上传?将帧压缩为JPG或PNG图像对于视频而言将非常昂贵。 – 2012-08-06 16:30:30

+0

我在播放视频前准备这些JPG帧。我的意思是,我只是使用已经创建的JPG文件。或者你说,我可以为我的纹理使用另一种(最有效的)格式? – 2012-08-07 09:52:22

回答

1

JPEG帧将解压缩非常昂贵。第一步:使用PNG。

但是等等!还有更多。

Cocos2D可以帮助你主要通过它的great support for sprite sheets

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

2

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

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

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

1

弗拉德,简单的答案是,你可能永远无法获得你列出的所有这些功能在同一时间工作。以60 FPS播放视频1024 x 1024的视频确实会有一定的延伸,我非常怀疑iOS硬件将能够跟上60FPS的数据传输速率。即使设备上的h.264硬件在1080p下也只能做到30FPS。这可能是有可能的,但是为了将图形渲染到视频上并且期望能够同时编辑亮度/对比度,它同时是太多东西。

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

+0

链接中断,@MoDJ我可以在哪里找到您的示例项目? – CAMOBAP 2015-11-19 10:53:33

+0

更新后的链接和说明,请现在试用。 – MoDJ 2015-11-20 22:33:44