VideoToolbox 可以将视频解压到 CVPixelBuffer,也可以压缩到 CMSampleBuffer
相关对象:
CVPixelBuffer
CVPixelBufferPool - 存放 CVPixelBuffer
pixelBufferAttributes - CFDictionary 对象,可能会包含视频的宽高,像素格式类型(32RGBA,YCbCr420),是否可以用于OpenGL ES等相关信息
CMSampleBuffer - 对于压缩的视频帧来说,包含了 CMTime,CMVideoFormatDesc 和 CMBlockBuffer;对于未压缩的光栅图像的话,则包含了 CMTime,CMVideoFormatDesc 和 CMPixelBuffer
CMTime - 分子是 64-bit 的时间值,分母是 32-bit 的时标 (time scale)
CMVideoFormatDescription - 视频宽高,格式 (kCMPixelFormat_32RGBA, kCMVideoCodecType_H264), 其他诸如颜色空间等信息的扩展
一般的解码流程:
- 从H.264 流中生成单独的 NALU
- 使用 CMVideoFormatDescriptionCreateFromH264ParameterSets( ) 从 SPS 和 PPS NALU 创建一个 CMVideoFormatDescriptionRef。如果不先执行此操作,将无法显示任何帧。
- 根据 “AVCC” 格式重新打包 IDR 和非 IDR 帧 NALU。 这需要用一个4字节的说明 NALU 长度的标头去替换 NALU 的起始代码。不需要为 SPS 和 PPS NALU 执行此操作。
- 将 CMBlockBuffer 打包到 CMSampleBuffer 中。
- 创建一个 VTDecompressionSessionRef 并将样本缓冲区输入 VTDecompressionSessionDecodeFrame( )。
- 在 VTDecompSession 回调中,使用生成的 CVImageBufferRef 来显示视频帧。