05:videoToolbox:硬解码
videoToolbox:硬解码
前言:VTDecompressionSession
工作流程:
1:创建解压的会话。
2:配置会话属性。
3:解压视频帧数据。
4:释放会话、释放资源。
介绍 VTDecompressionSession
管理传入视频数据解压缩的会话对象。
解压缩会话支持视频帧序列的解压缩。
核心思路
1: 用NSInputStream读入原始H.264码流,
2: 用CADisplayLink控制显示速率,
3: 用NALU的前四个字节识别SPS和PPS并存储,
4: 当读入IDR帧的时候初始化VideoToolbox,并开始同步解码;
5: 解码得到的CVPixelBufferRef会传入OpenGL ES类进行解析渲染。
0.(可选)创建一个视频格式信息
当你要解压H264格式的视频,你要用SPS,PPS数据来创建一个CMVideoFormatDescription
,得到它的格式信息
一:创建解压的会话。
1.1:方法说明:
OSStatus VTDecompressionSessionCreate(
CFAllocatorRef allocator,
//1:分配器,传NULL会使用默认的分配器
CMVideoFormatDescriptionRef videoFormatDescription, //2:源视频帧的描述。
CFDictionaryRef videoDecoderSpecification, //3:必须使用的特定视频解码器。传递NULL以让VideoToolbox选择解码器。
CFDictionaryRef destinationImageBufferAttributes, //4:
目标图片缓存的属性.传NULL会设为没有requirements.
const VTDecompressionOutputCallbackRecord *outputCallback,//5:
回调输出.如果,你要用VTDecompressionSessionDecodeFrameWithOutputHandler(_:_:_:_:_:)来解码视频帧,你可以设为NULL.不然就得不到输出数据.
VTDecompressionSessionRef _Nullable *decompressionSessionOut
//6:用于接收新的decompression session
);
1.2:实例解析
VTDecodeFrameFlags flags = 0;
VTDecodeInfoFlags flagOut = 0;
// 默认是同步操作。
// 调用didDecompress,返回后再回调
OSStatus decodeStatus = VTDecompressionSessionDecodeFrame(mDecodeSession,
sampleBuffer,
flags,
&outputPixelBuffer,
&flagOut);