h.264数据包使用Apple的VideoToolbox进行"实时"播放/预览

use*_*182 2 compression video-capture decoding avfoundation osx-mavericks

从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服务器.(希望我不需要,虽然我在网上看到有人做过.)

任何帮助将不胜感激.

谢谢!

use*_*182 9

好吧,它已经有一段时间了,但我终于弄清楚如何正确使用VideoToolbox与原始的未压缩和编码数据流.

基本上,我不得不熟悉H264的规格,并从这篇伟大的帖子中获得了很多帮助.

这是步骤

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

我希望这可以帮助别人.