05:videoToolbox:硬解码
2024-09-01 09:23:33
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);
最新文章
- 三大框架SSH整合
- Linux CGroup之freezer分析与应用
- TensorFlow安装(Ubuntu 16.04)
- JS 控制CSS样式表
- Android安全开发之WebView中的地雷
- Spring定时器,定时执行(quartz)
- 14SpringMvc_在业务控制方法中写入HttpServletRequest,HttpServletResponse等传统web参数(这个知识点知道就好了,不推荐这么去做)
- 【bzoj1036】 ZJOI2008—树的统计Count
- *ecshop 首页促销价显示倒计时
- vim插件介绍
- Gitlab安装和使用相关信息
- [改善Java代码]用枚举实现工厂方法模式更简洁
- 微信js-sdk,选择图片,上传,下载到本地,php服务端
- vs开发常用快捷键
- linux磁盘管理系列-软RAID的实现
- Maven-04: 三套生命周期
- mysql 命令语句
- LINUX内核分析第七周学习总结——可执行程序的装载
- _spellmod_leech_aura
- 读《SQL优化核心思想》:你不知道的优化技巧