h.264数据包到实时'使用Apple的VideoToolbox播放/预览

时间:2014-04-25 01:58:37

标签: avfoundation osx-mavericks video-capture decoding compression

从Apple文档中,在OSX 10.9中不推荐使用Quicktime框架,而是支持AVFoundations和AVKit。由于我不确定的原因,大多数文档忽略了一些名为VideoToolbox的框架涵盖了一些Quicktime框架替换功能。该替换功能包括解码和解压缩等。

我想解码和解压缩h.264编码的视频数据包(NAL包,TS包等等),将它们放在像素缓冲区中,然后使用Core Video和OpenGL显示视频。

我通过usb从编码框获取视频数据包。运行[AVCaptureDevice devices]时,此框不会显示。所以我不能使用大多数AVFoundation(据我所知)直接与盒子接口。但是,盒子附带了一个api,可以访问视频数据包文件。我可以将它们写入磁盘并创建一个可以通过quicktime播放的视频。但是进行实时播放是个问题。因此,解码,解压缩和创建像素缓冲区的问题让我可以使用Core Video和OpenGL。

我认为如果我可以创建像素缓冲区,我可以使用AVAssetWriterInputPixelBufferAdaptor并找出将其转换为AVCaptureSession的方法。如果我能做到这一点,我应该可以放弃使用OpenGL并使用AVFoundations和AVKit提供给我的工具。

另外,从我对AVFoundations文档的阅读中,每次他们谈论视频/音频数据流时,他们都在谈论两件事之一;来自AVCaptureDevice的流或来自HTTP Live Stream的流处理。就像我之前说的那样,生成视频数据包的框不会显示为AVCaptureDevice。并且,如果我不需要,我宁愿不构建/实现HTTP Live Streaming服务器。 (希望我不需要,虽然我在网上看到有人做过。)

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:9)

好的,已经有一段时间了,但我终于弄明白了如何正确使用VideoToolbox和原始的未压缩和编码数据流。

基本上,我必须熟悉H264规范,并从great post获得了很多帮助。

以下是步骤

  1. 确保获得序列参数集(SPS)和图片 开始处理任何数据之前的参数集(PPS)。
  2. 使用SPS和PPS获取创建avcc原子所需的数据 头。请参阅我上面链接的帖子。
  3. 在NSData中保存avcc atom标头。
  4. 使用avcc atom创建CMVideoFormatDescription并进行配置 推广。请参阅CMVideoFormatDescriptionCreate文档。
  5. 设置VTDecompressionOutputCallbackRecord
  6. 设置将在其中使用的pixelBufferAttributes VTDecompressionSessionCreate。
  7. 根据创建时未使用的数据创建CMBlockBuffer CMVideoFormatDescription。请参阅CMBlockBufferCreateWithMemoryBlock。 基本上,您要确保添加原始数据包 这不是SPS或PPS。您可能需要添加大小 当前的nal数据包+ 4,一切正常。再次 请参阅上面的链接。
  8. 创建CMBlockBuffer
  9. 创建CMSampleBuffer
  10. 在VTDecompressionSessionDecodeFrame中使用CMSampleBuffer  解码。
  11. 在VTDecompressionSessionDecodeFrame之后运行VTDecompressionSessionWaitForAsynchronousFrames。我注意到如果我没有运行VTDecompressionSessionWaitForAsynchronousFrames,我的显示输出就是紧张不安。
  12. 您为所使用的功能定义了哪些功能  将调用VTDecompressionOutputCallbackRecord。现在,我  我将一个CVPixelBufferRef传递给OpenGL,将视频写入  屏幕。也许在某些时候我会尝试使用AVFoundations  写到屏幕上。
  13. 我希望这有助于某人。