视频文件打开流程

先丢一个流程图

open函数,需要传入url,返回bool是否成功打开

在打开输入流之前先定义了参数字典,通过这个字典和传入的url打开输入流

解封装过程

解封装上下文->视频流

打开输入流,返回解封装上下文

通过解封装上下文读取媒体信息,顺带得到视频总时长

再通过解封装上下文和AVMEDIA_TYPE_VIDEO枚举视频流ID

就能在解封装上下文中根据视频流ID获取视频流

解码过程

视频流->解码器->解码器上下文->打开解码器

videoStream->codecpar 是一个 AVCodecParameters*,它保存了解封装后提取出的流的编解码参数,是解封装阶段从媒体中提取出来的参数集合

AVFormatContext(解封装)和 AVCodecContext(解码)是两个阶段,前面只是解封装了,但并没有解码

通过视频流里的codecpar参数集合找到视频分辨率(长和宽)和总帧率,

直接从视频流获取视频帧率,但涉及分数(AVRational)到小数(qreal)的转换

解码器配置

再通过视频流里的codecpar参数集合中的codec->id 解码器ID获取视频解码器

通过解码器获取解码器上下文

然后使用视频流的codecpar为解码器上下文赋值,再使用赋值后的解码器上下文打开解码器

内存分配

最后提前分配AVPacket数据包和AVFrame解码后的视频帧的空间

根据之前得到的图像分辨率,计算图像所需内存大小,然后按计算得到的大小分配图像数据空间