我有一个有趣的问题,我需要研究与非常低水平的视频流有关。
有没有人有过将原始字节流(分成每像素信息,但不是视频的标准格式)转换成低分辨率视频流的经验?我相信我可以将数据映射成每像素字节的RGB值,因为与原始数据中的值对应的颜色值将由我们确定。我不确定从那里开始,或者每像素的RGB格式需要是什么。
我看过FFMPeg,但它的文档是巨大的,我不知道从哪里开始。
我有具体的问题包括,是否有可能创建CVPixelBuffer与像素数据?如果我要这样做,我需要将每像素数据转换为哪种格式?
另外,我是否应该更深入地研究OpenGL,如果是的话,哪里是寻找这个主题信息的最佳场所?
CGBitmapContextCreate呢?例如,如果我这样做,一个典型的像素字节应该是什么样子?这是否足够快以保持帧率高于20fps?
编辑:
我认为在你们两个的出色帮助下,以及我自己的一些更多的研究,我已经制定了一个如何构建原始RGBA数据的计划,然后从该数据构建一个CGImage,然后从CGImage创建一个cgpixelbuffer。
然而,当数据出现时,我不确定我会看到哪种类型的FPS。我画他们到CALayer,或者有一些类似的类avassetwwriter,我可以用它来播放它,因为我追加CVPixelBuffers。我的经验是使用avassetwwriter将构建的CoreAnimation层次结构导出到视频,因此视频总是在开始播放之前构建,而不是显示为实时视频。
我以前这样做过,我知道您不久前发现了我的GPUImage项目。正如我在那里回答的问题一样,GPUImageRawDataInput是你想要的,因为它可以快速上传RGBA, BGRA或RGB数据直接进入OpenGL ES纹理。从那里,帧数据可以被过滤,显示在屏幕上,或记录到一个电影文件。
根据我的个人经验,您提出的通过CGImage到CVPixelBuffer的路径不会产生非常好的性能。当通过核心图形的实时视频时,有太多的开销。你想直接使用OpenGL ES来获得最快的显示速度。
我甚至可以改进我的代码,使它比现在更快。我目前使用glTexImage2D()
从本地字节更新纹理数据,但使用iOS 5.0中引入的纹理缓存来加速保持其大小的纹理中的刷新数据可能会更快。设置缓存会有一些开销,这会使它们在一次性上传时速度稍慢,但使用它们快速更新数据应该会更快。
My two cents:
我做了一个opengl游戏,让用户记录一个3d场景。回放是通过重放场景来完成的(而不是播放视频,因为实时编码不能产生舒适的FPS)。
有一个技术可以帮助,不幸的是我没有时间实现它:http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/
这项技术应该减少从openGL获取像素的时间。您可能会得到一个可接受的视频编码率。