我们如何才能从iPhone相机获得H.264编码的videostream?

我正在使用以下来获取video采样缓冲区:

- (void) writeSampleBufferStream:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType 

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

2017年更新:

您现在可以使用VideoToolbox API进行stream式传输video和audio。 阅读这里的文档: VTCompressionSession

原始答案(从2013年起):

简而言之:你不能,你收到的样本缓冲区是未压缩的。

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

  • AVAssetWriter
  • AVCaptureMovieFileOutput

正如你可以看到写入文件一样,写入pipe道的操作不起作用,因为编码器在帧或GOP完全写入后更新标题信息。 所以你最好在编码器写入的时候不要触摸文件,因为它会随机地重写头信息。 如果没有这个标题信息,video文件将无法播放(它会更新大小字段,所以写入的第一个标题表示文件是0字节)。 直接写入存储区目前不支持。 但是你可以打开编码的video文件,并将stream解复用到h264数据(编码器closures文件之后)

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

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

请注意,在每个AVAssetWriter写入之后,您将知道一个完整的H264 NAL被写入mp4。 您可以编写代码,在每次由AVAssetWriter写入之后读取完整的H264 NAL,这将使您能够访问H264编码的帧。 以适当的速度来做正确的事情可能需要一点时间,但这是可行的(我成功地做到了)。

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

检查我的post到iPhone的H 264stream的SPS值,看看我的代码中使用的一些SPS / PPS。

只是最后一点,在我的情况下,我不得不stream传输h264编码帧到另一个端点解码/查看; 所以我的代码不得不这样做很快。 就我而言,这是相对较快的; 但最终我切换到VP8的编码/解码,只是因为它更快,因为一切都在内存中完成,没有文件读/写。

祝你好运,希望这个信息有帮助。