我们如何从iPhone相机获得H.264编码的视频流?

Suk*_*ngh 7 iphone h.264 ipad ios

我正在使用以下来获取视频样本缓冲区:

- (void) writeSampleBufferStream:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType
Run Code Online (Sandbox Code Playgroud)

现在我的问题是如何从上面的sampleBuffer获得h.264编码的NSData .请建议.

Aki*_*Aki 7

您只能从AVFoundation获取BGRA或YUV颜色格式的原始视频图像.但是,当您通过AVAssetWriter将这些帧写入mp4时,它们将使用H264编码进行编码.

关于如何做到这一点的代码的一个很好的例子是RosyWriter

请注意,在每次AVAssetWriter写入之后,您将知道已将一个完整的H264 NAL写入mp4.您可以编写在AVAssetWriter每次写入后读取完整H264 NAL的代码,这将使您可以访问H264编码的帧.可能需要一点时间才能以合适的速度完成它,但它是可行的(我做得很成功).

顺便说一句,为了成功解码这些编码的视频帧,您将需要位于mp4文件中不同位置的H264 SPS和PPS信息.在我的情况下,我实际上创建了几个测试mp4文件,然后手动提取出来.由于这些不会更改,除非您更改H264编码的规范,否则您可以在代码中使用它们.

在iPhone中检查我的帖子到H 264流的SPS值,看看我在代码中使用的一些SPS/PPS.

最后一点,在我的情况下,我不得不将h264编码的帧流式传输到另一个端点进行解码/查看; 所以我的代码必须快速完成.就我而言,它相对较快; 但最终我切换到VP8进行编码/解码只是因为速度更快,因为一切都是在没有文件读/写的情况下在内存中完成的.

祝你好运,希望这些信息有所帮助.


Dun*_*ern 6

2017年更新:

您现在可以使用VideoToolboxAPI进行视频和音频流式传输.阅读此处的文档:VTCompressionSession

原始答案(自2013年起):

简短:您不能,您收到的样本缓冲区是未压缩的.

获得硬件加速h264压缩的方法:

正如您可以看到写入文件一样,写入管道不起作用,因为编码器在完全写入帧或GOP后更新标头信息.因此,当编码器写入文件时,最好不要触摸文件,因为它会随机重写标题信息.如果没有此标头信息,视频文件将无法播放(它会更新大小字段,因此写入的第一个标头表示文件为0字节).目前不支持直接写入存储区.但是你可以打开编码的视频文件与多路分流去的H264数据(编码器已经关闭过程中的文件)