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

Posted

技术标签:

【中文标题】h.264 数据包使用 Apple 的 VideoToolbox 进行“实时”播放/预览【英文标题】:h.264 data packets to 'realtime' playback/preview using Apple's VideoToolbox 【发布时间】:2014-04-25 01:58:37 【问题描述】:

根据 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 实时流服务器。 (希望我不需要,虽然我在网上看到有人这样做。)

任何帮助将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

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

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

步骤如下

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

我希望这对某人有所帮助。

【讨论】:

如果你有苹果开发者账号,可以查看this post

以上是关于h.264 数据包使用 Apple 的 VideoToolbox 进行“实时”播放/预览的主要内容,如果未能解决你的问题,请参考以下文章

avc(H.264,高级视频编码,Advanced Video Coding,x264)和hevc(h.265,高效率视频编码,High Efficiency Video Coding,x265)区别

avc(H.264,高级视频编码,Advanced Video Coding,x264)和hevc(h.265,高效率视频编码,High Efficiency Video Coding,x265)区别

带有 .h264 扩展名的 Html 视频

如何将 H.264 UDP 数据包转换为可播放的媒体流或文件(碎片整理)

使用 Broadway.js 解码原始 h.264

使用 AVFoundation 在 iOS 上播放套接字流式传输的 h.264 电影