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)区别