视频解码流程

read函数,返回Qimage
完成解码:原始数据包->发送给解码器上下文->解码后视频帧
首先从解封装上下文读取原始数据帧进packet数据包
把数据包发送给解码器上下文有两种情况,
一种是读取已完成发空数据包,一种是正常传原始数据包
如果不是空包,就涉及将pts和dts由时间戳转换为毫秒单位,再发送给解码器

图像格式转换

图像转换上下文->进行转换->最后转成QImage
必须在解码后才能初始化图像转换上下文,硬解码时图像格式会发生改变,因此只有解码后才能安全进行图像转换
初始化的api需要传入图像输入输出的分辨率、缩放算法(比如YUV和RGB)、滤波器信息(可以null),返回初始化后的图像转换上下文
api的逻辑是获取缓存的图像转换上下文。首先校验上述参数是否一致,如果校验不通过就释放资源;然后判断上下文是否存在,如果存在直接复用,如不存在进行分配、初始化操作。
这里得到YUV到RGB的图像格式转换上下文,将转换好的图像格式存入_swsContext图像转换上下文

图像平面与步幅

然后利用这个上下文进行图像转换,需要输入输出存放每个平面指针的data数组,存放每平面步幅的lines数组,额外输入第几行开始处理,总共处理多少行
图像平面指的是图像中某一个颜色通道的所有像素数据组成的二维区域,每个颜色通道的数据单独存储在一块连续的内存中,这块内存就叫做一个”平面”。
RGB所有颜色连续存储,只有一个平面;YUV 图像的 Y、U、V 分量是分开存储的,分别在不同的内存区域,有Y、U、V三个平面
步幅就是每平面每行的字节数,每个图像平面中,一行像素数据实际占用的内存字节数

转换为Qt图像

图像转换完成后m_frame解码后的视频帧里存的就是rgb格式
可以直接转化成QImage格式