avfoundation - h.264数据包到 'realtime'播放/预览使用苹果的VideoToolbox

标签 avfoundation osx-mavericks video-capture decoding compression

根据 Apple 文档,Quicktime 框架在 OSX 10.9 中已弃用,取而代之的是 AVFoundations 和 AVKit。由于我不确定的原因,大多数文档都忽略了一些 Quicktime 框架替换功能包含在名为 VideoToolbox 的框架中。该替换功能包括解码和解压缩等。

我想解码和解压缩 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 服务器。 (希望我不需要,尽管我在网上看到有人这样做。)

如有任何帮助,我们将不胜感激。

谢谢!

最佳答案

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

基本上,我必须熟悉 H264 规范并从这个 great post 中得到很多帮助。 .

步骤如下

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

我希望这对某人有帮助。

关于avfoundation - h.264数据包到 'realtime'播放/预览使用苹果的VideoToolbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282958/

相关文章:

video-streaming - AVPlayer - 获取可用带宽/比特率流的列表并强制其中之一

ios - 在 OS X Mavericks 上安装 Calabash-cucumber 错误

linux - FFMpeg kmsgrab 记录像素错误

c++ - 如何使用 OpenCV 在视频中查找对象

FFmpeg:无法使用 strftime 获取帧文件名

objective-c - VNSequenceRequestHandler 上的 EXC_BAD_ACCESS

ios - AVQueuePlayer 从 Assets 跳转到另一个 Assets 时出现恼人的滞后

python - 升级到 Mavericks 后 Bpython 无法工作

ios - 为什么播放时系统不保留一个AVAudio播放器?

xcode - Xcode的Interface Builder中没有水平滚动条