本章节重点讲解FFMPEG中对于视频图像格式转换的处理。
一、视频格式转换的基本API
视频帧图像的格式转换、缩放等处理,主要使用 libswscale库中的API函数完成的
- sws_getContext() 根据要输入输出图像的 宽高和 像素格式 创建转换器
- sws_scale() 根据输入图像数据进行实际的转换操作,结果输出到输出缓冲区上
- sws_freeContext()释放转换器
这几个API函数的功能比较明确,关键是参数的设置,特别是sws_scale()几个参数的设置,具体的参数值依赖于相应的视频帧图像格式。
二、常用的视频帧图像格式
- YUV420P格式
在YUV420P的存储格式中,每4个像素点占用4个Y、1个U、1个V,Y分量、U分量、V分量的数据分别单独存放,对应AVFrame结构体中字段
typedef struct AVFrame {
......
//
// 视频帧图像数据 或者 音频帧PCM数据, 根据不同的格式有不同的存放方式
// 对于视频帧:RGB/RGBA 格式时 data[0] 中一次存放每个像素的RGB/RGBA数据
// YUV420 格式时 data[0]存放Y数据; data[1]存放U数据; data[2]存放V数据
// 对于音频帧: data[0]存放左声道数据; data[1]存放右声道数据
//
uint8_t *data[AV_NUM_DATA_POINTERS];
//
// 行字节跨度, 相当于stride
// 对于视频帧: 上下两行同一列像素相差的字节数,例如:对于RGBA通常是(width*4), 但是有时FFMPEG内部会有扩展, 可能会比这个值大
// 对于音频帧: 单个通道中所有采样占用的字节数
//
int linesize[AV_NUM_DATA_POINTERS];
int format; // 对于视频帧是图像格式; 对于音频帧是采样格式
int64_t pts; // 当前数据帧的时间戳
int width, height; // 仅用于视频帧, 宽度高度
int key_frame; // 仅用于视频, 当前是否是I帧
......
}
![](https://img-blog.csdnimg.cn/img_convert/8e099a9ea02152fb7b061d8da0f6b5ae.webp?x-oss-process=image/format,png)
以一张 720*1280的视频帧图像为例&#