我正在使用以下来获取视频样本缓冲区:
- (void) writeSampleBufferStream:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType
现在我的问题是如何从 sampleBuffer 中获取h.264编码的NSData。请建议。
答案 0 :(得分:7)
您只能从AVFoundation获取BGRA或YUV颜色格式的原始视频图像。但是,当您通过AVAssetWriter将这些帧写入mp4时,它们将使用H264编码进行编码。
关于如何执行此操作的代码的一个很好的示例是RosyWriter
请注意,在每次AVAssetWriter写入之后,您将知道已将一个完整的H264 NAL写入mp4。您可以编写在AVAssetWriter每次写入后读取完整H264 NAL的代码,这将使您可以访问H264编码的帧。可能需要一点才能以合适的速度做到正确,但它是可行的(我做得很成功)。
顺便说一句,为了成功解码这些编码视频帧,您需要H264 SPS和PPS信息,这些信息位于mp4文件的不同位置。在我的情况下,我实际上创建了几个测试mp4文件,然后手动提取出来。由于这些不会更改,除非您更改H264编码的规范,否则您可以在代码中使用它们。
将我的帖子检查到SPS values for H 264 stream in iPhone,查看我在代码中使用的部分SPS / PPS。
最后一点,在我的情况下,我必须将h264编码的帧流式传输到另一个端点进行解码/查看;所以我的代码必须快速完成。就我而言,它相对较快;但最终我切换到VP8进行编码/解码只是因为速度更快,因为一切都是在内存中完成的,没有文件读/写。
祝你好运,希望这些信息有所帮助。
答案 1 :(得分:6)
2017年更新:
您现在可以使用VideoToolbox
API来播放视频和音频。
请阅读此处的文档:VTCompressionSession
原始答案(自2013年起):
简短:你不能,你收到的样本缓冲区是未压缩的。
获得硬件加速h264压缩的方法:
正如您所看到的那样,写入文件时,写入管道不起作用,因为编码器在完全写入帧或GOP后更新标题信息。因此,当编码器写入文件时,最好不要触摸文件,因为它会随机重写标题信息。如果没有此标头信息,视频文件将无法播放(它会更新大小字段,因此写入的第一个标头表示文件为0字节)。目前不支持直接写入存储区。但您可以打开编码的视频文件并对流进行解复用以获取h264数据( 编码器当然关闭文件后)