2013-03-30 18 views
4

我有一个有趣的问题,我需要研究与非常低级别的视频流相关的问题。将原始数据转换为适用于iOS的可显示视频

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

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

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

此外,我是否应该更深入地研究OpenGL,如果是的话,哪里可以找到关于此主题的信息?

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

编辑

我想与你两个优秀的帮助,并以我个人的一些更多的研究,我已经把如何构建原始RGBA数据,然后构建一个CGImage计划从这些数据开始,从这个CVPixelBuffer from CGImage的CGImage中创建一个CVPixelBuffer。

但是,要在数据进入时播放那些数据,我不确定我会看到什么样的FPS。我将它们绘制到CALayer,还是有一些类似于AVAssetWriter的类,我可以在添加CVPixelBuffers时使用它来播放它。我拥有的经验是使用AVAssetWriter将构建的CoreAnimation层次结构导出到视频,因此视频总是在开始播放之前构建的,而不是作为实时视频显示。

+2

有一个deeeeeeeeep看AVFoundation,尤其是AVAssetWriter。阅读完该文档后,一个好的起点可能是“[如何将UIImage数组导出为电影](http://stackoverflow.com/questions/3741323/how-do-i-export-uiimage-array-as -a-电影/ 3742212)”。 – Till

+0

我已经使用AVAssetWriter完成了相当多的工作,但是目前的问题是我不知道如何构建原始像素数据。 –

+1

确实是这个问题。您必须弄清楚如何使用您从流中接收的原始数据构建像素缓冲区。这将取决于传入数据的格式,编码等。一旦你有了,请检查@Till推荐的推荐和AVAssetWritter。这可能有帮助 CVPixelBufferRef buffer =(CVPixelBufferRef)[self pixelBufferFromCGImage:theImage size:CGSizeMake(image.size.width,image.size.height)]; if(buffer) if(![adapter appendPixelBuffer:buffer withPresentationTime:CMTimeMake(frame,fps)]){ –

回答

5

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

根据我的个人经验,您提出的将CGImage传递给CVPixelBuffer的路径不会产生非常好的性能。在通过Core Graphics实时视频时,开销太大。您希望直接进入OpenGL ES,以获得最快的显示速度。

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

+0

甚至不能告诉你我多么感激你的帮助。我在那边回答,但为了防止其他人来找我,我只是想确保我正确理解课程。我猜我在GPUImageRawDataInput上每帧调用uploadBytes?从那里我添加我用作RawDataInput的目标的GPUImageFilter,然后添加GPUImageView作为我使用的过滤器的目标?如果我想跳过过滤器,那么我可以将RawDataInput添加为GPUImageView的目标,或者我会以某种方式使用RawDataOutput? –

+1

@MattFoley - 是的,你需要使用'-uploadBytes:',每一个新的框架都进来了。你还需要用'-processData'来跟着它,让它沿着管道的其余部分传播一次上传。如果显示器是你所关心的,你可以直接从原始数据输入到GPUImageView。 –

+0

嗨布拉德,一年后,我仍然在空闲时间在这个软件上工作。你提到,如果显示器是我所需要调用的“processData:”,那么重要。我很高兴地说,我们已经播放了相当长一段时间的原始数据,但是目前我正在将GPUImageMovieWriter与您帮助我的GPUImageRawDataInput集成在一起,并在AVAssetWriter上运行时处于“12902”状态开始录制。这是我的代码:http://pastebin.com/LD6ZcJtN是否需要额外的步骤我缺少?感谢Brad的一切! –

1

我的2美分:

我做了一个OpenGL游戏,让用户记录中的3D场景。播放经重放的场景(而不是播放视频,因为实时编码,并没有产生舒适的FPS做

有一种技术,它可以帮帮忙,可惜我没有时间去实现它。 http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/

这种技术应该减少时间越来越像素从openGL的回来。你可能会得到一个可接受的视频编码率。