根据 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 中得到很多帮助。 .
步骤如下
- 确保获得序列参数集 (SPS) 和图片 开始处理任何数据之前的参数集 (PPS)。
- 使用 SPS 和 PPS 获取创建 avcc 原子所需的数据 header 。请参阅我上面链接的帖子。
- 将 avcc 原子 header 保存在 NSData 中。
- 使用 avcc 原子创建一个 CMVideoFormatDescription 并配置 扩展。请参阅 CMVideoFormatDescriptionCreate 文档。
- 设置 VTDecompressionOutputCallbackRecord
- 设置将在中使用的pixelBufferAttributes VTDecompressionSessionCreate。
- 从创建时未使用的数据创建 CMBlockBuffer CMVideoFormatDescription。请参阅 CMBlockBufferCreateWithMemoryBlock。 基本上,您要确保添加的是原始数据包 不是 SPS 或 PPS。您可能需要添加尺寸 当前的最终数据包 + 4,一切正常。再次 请参阅上面的链接。
- 创建 CMBlockBuffer
- 创建CMSampleBuffer
- 在VTDecompressionSessionDecodeFrame中使用CMSampleBuffer来做 解码。
- 在 VTDecompressionSessionDecodeFrame 之后运行 VTDecompressionSessionWaitForAsynchronousFrames。我注意到如果我没有运行 VTDecompressionSessionWaitForAsynchronousFrames,我的显示输出会出现抖动。
- 您为中使用的函数定义了什么功能 VTDecompressionOutputCallbackRecord 将被调用。目前,我 我将 CVPixelBufferRef 传递给 OpenGL 以将视频写入 屏幕。也许在某个时候我会尝试使用 AVFoundations 来 写到屏幕上。
我希望这对某人有帮助。
关于avfoundation - h.264数据包到 'realtime'播放/预览使用苹果的VideoToolbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282958/