FFmpeg图像拉伸libswscale


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

例。Libswscale里面实现了各种图像像素格式的转换,例如YUV与RGB之间的转换;以及图像大小缩放(例如640x360拉伸为1280x720)功能。而且libswscale还做了相应指令集的优化,因此它的转换效率比自己写的C语言的转换效率高很多。


本文记录的程序将像素格式为YUV420P,分辨率为480x272的视频转换为像素格式为RGB24,分辨率为1280x720的视频。




流程

简单的初始化方法

Libswscale使用起来很方便,最主要的函数只有3个:

(1)       sws_getContext():使用参数初始化SwsContext结构体。

(2)       sws_scale():转换一帧图像。

(3)       sws_freeContext():释放SwsContext结构体。

其中sws_getContext()也可以用另一个接口函数sws_getCachedContext()取代。




个知识点

下文记录几个图像像素数据处理过程中的几个知识点:像素格式,图像拉伸,YUV像素取值范围,色域。


像素格式

像素格式的知识此前已经记录过,不再重复。在这里记录一下FFmpeg支持的像素格式。有几点注意事项:

(1)       所有的像素格式的名称都是以“AV_PIX_FMT_”开头

(2)       像素格式名称后面有“P”的,代表是planar格式,否则就是packed格式。Planar格式不同的分量分别存储在不同的数组中,例如AV_PIX_FMT_YUV420P存储方式如下:


data[0]: Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8……

data[1]: U1, U2, U3, U4……

data[2]: V1, V2, V3, V4……


Packed格式的数据都存储在同一个数组中,例如AV_PIX_FMT_RGB24存储方式如下:


data[0]: R1, G1, B1, R2, G2, B2, R3, G3, B3, R4, G4, B4……

 

(3)       像素格式名称后面有“BE”的,代表是Big Endian格式;名称后面有“LE”的,代表是Little Endian格式。

 

FFmpeg支持的像素格式的定义位于libavutil\pixfmt.h,是一个名称为AVPixelFormat的枚举类型,如下所示。



好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***