我有一个有趣的问题,我需要研究与非常低级别的视频流相关的问题。
有没有人有将原始字节流(分为每个像素信息,但不是标准格式的视频)转换为低分辨率视频流的经验?我相信我可以将数据映射到每个像素字节的 RGB 值,因为与原始数据中的值对应的颜色值将由我们决定。我不确定从那里去哪里,或者每个像素需要什么 RGB 格式。
我看过 FFMPeg,但它的文档很多,我不知道从哪里开始。
我的具体问题包括,是否可以使用该像素数据创建 CVPixelBuffer?如果我这样做,我需要将每像素数据转换成什么样的格式?
另外,我是否应该更深入地研究 OpenGL,如果是这样,寻找有关此主题的信息的最佳位置在哪里?
CGBitmapContextCreate 怎么样?例如,如果我选择了 this 之类的东西,那么典型的像素字节应该是什么样子的?这是否足够快以将帧速率保持在 20fps 以上?
编辑 :
我想在你们两个的出色帮助下,以及我自己的更多研究,我已经制定了一个计划,如何构建原始 RGBA 数据,然后从该数据构建一个 CGImage,然后从该 CGImage 创建一个 CVPixelBuffer从这里 CVPixelBuffer from CGImage 。
但是,要在数据输入时实时播放,我不确定我会看到什么样的 FPS。我是否将它们绘制到 CALayer,或者是否有一些类似于 AVAssetWriter 的类,我可以在附加 CVPixelBuffers 时使用它来播放它。我的经验是使用 AVAssetWriter 将构建的 CoreAnimation 层次结构导出到视频,因此视频总是在开始播放之前构建,而不是显示为实时视频。
最佳答案
我以前做过这个,我知道你不久前发现了我的 GPUImage 项目。正如我在那里回答的问题,GPUImageRawDataInput 正是您想要的,因为它可以将 RGBA、BGRA 或 RGB 数据直接快速上传到 OpenGL ES 纹理中。从那里,帧数据可以被过滤,显示到屏幕上,或记录到电影文件中。
根据我的个人经验,您提议的通过 CGImage 到 CVPixelBuffer 的路径不会产生非常好的性能。通过 Core Graphics 获取实时视频时开销太大。您想直接转到 OpenGL ES 以获得最快的显示速度。
我什至可以改进我的代码,使其比现在更快。我目前使用 glTexImage2D()
从本地字节更新纹理数据,但使用 iOS 5.0 中引入的纹理缓存来加速刷新纹理内保持其大小的数据可能会更快。设置缓存会产生一些开销,这使得一次性上传的速度变慢,但使用它们快速更新数据应该更快。