将原始数据转换为iOS的可显示视频

时间:2013-03-30 18:15:13

标签: ios video encoding opengl-es core-video

我有一个有趣的问题需要研究与非常低级别的视频流有关。

有没有人有过将原始字节流(分为每像素信息,但不是标准格式的视频)转换为低分辨率视频流的经验?我相信我可以将数据映射到每像素字节的RGB值,因为与原始数据中的值对应的颜色值将由我们确定。我不知道从那里去哪里,或者每个像素需要RGB格式。

我看过FFMPeg,但它的文档非常庞大,我不知道从哪里开始。

我所包含的具体问题是,是否可以使用该像素数据创建CVPixelBuffer?如果我这样做,我需要转换为每像素数据的格式是什么?

另外,我是否应该更深入地研究OpenGL,如果是这样,哪里可以找到有关此主题的信息的最佳位置?

CGBitmapContextCreate怎么样?例如,如果我去了this,那么典型的像素字节需要看起来像什么?这是否足够快以保持帧速率高于20fps?

修改

我认为在您的帮助下,以及我自己的一些研究,我已经制定了如何构建原始RGBA数据的计划,然后根据该数据构建CGImage,然后创建一个CVPixelBuffer来自这里的CGImage CVPixelBuffer from CGImage

然而,随着数据进入现场播放,我不确定我会看到什么样的FPS。我是否将它们绘制到CALayer,或者是否有类似AVAssetWriter的类,我可以使用它来添加CVPixelBuffers。我的经验是使用AVAssetWriter将构建的CoreAnimation层次结构导出到视频,因此视频总是在开始播放之前构建,而不是显示为实时视频。

2 个答案:

答案 0 :(得分:5)

我以前做过这个,我知道你刚刚找到了我的GPUImage项目。当我回答那里的问题时,GPUImageRawDataInput就是你想要的,因为它可以将RGBA,BGRA或RGB数据直接快速上传到OpenGL ES纹理中。从那里,帧数据可以被过滤,显示在屏幕上,或记录到电影文件中。

根据我的个人经验,您建议通过CGImage到CVPixelBuffer的路径不会产生非常好的性能。通过Core Graphics获取实时视频时会产生太多开销。您希望在此处以最快的显示速度直接进入OpenGL ES。

我甚至可以改进我的代码,使其比现在更快。我目前使用glTexImage2D()来更新本地字节的纹理数据,但是使用iOS 5.0中引入的纹理缓存来加速刷新保持其大小的纹理内的数据可能会更快。设置缓存有一些开销,这使得它们对于一次性上传来说有点慢,但快速更新数据的速度应该更快。

答案 1 :(得分:1)

我的2美分:

我做了一个opengl游戏,让用户录制一个3D场景。播放是通过重放场景完成的(而不是播放视频,因为实时编码不会产生舒适的FPS。

有一种技术可以提供帮助,遗憾的是我没有时间实施它: http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/

这种技术可以缩短从openGL获取像素的时间。您可能会获得可接受的视频编码率。