在我的应用程序中,我应该以不寻常的方式播放视频。 像特殊用途的交互式播放器。
主要问题:
现在我正在做下一件事:
所有看起来都很好,直到我使用320 * 240像素,但如果我使用512 * 512px,我的播放率会下降。也许计时器行为问题,也许是OpenGL。有时,如果我试图打开具有高播放速率(超过10-15 FPS)的大纹理,应用程序只会因内存警告而崩溃。
解决此问题的最佳做法是什么?我应该挖什么方向?也许cocos2d或其他游戏引擎可以帮助我? Mb JPG不是纹理的最佳解决方案,我应该使用PNG或PVR或其他?
答案 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)
您应该专注于实际可行的内容,而不是尝试执行每项功能。如果您想查看将iPad硬件推向极限的示例Xcode应用程序,请查看我的Fireworks示例项目。此代码同时在屏幕上显示多个已解码的h.264视频。该实现是围绕CoreGraphics API构建的,但关键在于,由于零复制优化,Apple将纹理上传到OpenGL的速度非常快。通过这种方法,可以将大量视频流式传输到设备。