libswscale 是一个主要用于处理图片像素数据的类库。可以完成图片像素格式的转换,图片的拉伸,图像的滤波等工作。
头文件<libswscale/swscale.h>
主要使用下面三个函数实现对图片的操作:
sws_getContext()/sws_getCachedContext():初始化一个SwsContext
sws_scale():处理图像数据
sws_freeContext():释放一个SwsContext
1、sws_getContext
struct SwsContext *sws_getContext( int srcW, /* 源图像的宽度 */
int srcH, /* 源图像的宽度 */
enum AVPixelFormat srcFormat, /* 源图像的像素格式 */
int dstW, /* 目标图像的宽度 */
int dstH, /* 目标图像的高度 */
enum AVPixelFormat dstFormat, /* 目标图像的像素格式 */
int flags,/* 选择缩放算法(只有当源图像和目标图像大小不同时有效),一般选择SWS_FAST_BILINEAR */
SwsFilter *srcFilter, /* 源图像的滤波器信息, 若不需要传NULL */
SwsFilter *dstFilter, /* 目标图像的滤波器信息, 若不需要传NULL */
const double *param /* 特定缩放算法需要的参数,默认为NULL */ );
sws_getContext() 和sws_getCachedContext() 类似,不同的在于sws_getContext可以用于多路码流转换,为每个不同的码流都指定一个不同的转换上下文,而 sws_getCachedContext 只能用于一路码流转换。
关于图像缩放算法flag的值在定义在libswscale\swscale.h中
#define SWS_FAST_BILINEAR 1
#define SWS_BILINEAR 2
#define SWS_BICUBIC 4
#define SWS_X 8
#define SWS_POINT 0x10
#define SWS_AREA 0x20
#define SWS_BICUBLIN 0x40
#define SWS_GAUSS 0x80
#define SWS_SINC 0x100
#define SWS_LANCZOS 0x200
#define SWS_SPLINE 0x400
#define SWS_SRC_V_CHR_DROP_MASK 0x30000
#define SWS_SRC_V_CHR_DROP_SHIFT 16
#define SWS_PARAM_DEFAULT 123456
#define SWS_PRINT_INFO 0x1000
关于各算法的性能可以查看雷神大大的博客 sws_scale缩放算法性能测试
2、sws_freeContext
void sws_freeContext(struct SwsContext *swsContext);
释放sws_getContext返回的SwsContext对象指针
3、sws_scale
int sws_scale(struct SwsContext *c, /*上下文结构体,sws_getContext返回的对象指针*/
const uint8_t *const srcSlice[], /*源图像颜色通道数据指针,AVFrame中的data[]*/
const int srcStride[],/*源图像每个颜色通道的跨度,行字节数,AVFrame中的linesize[],可以确定下一行的起始位置*/
int srcSliceY, /*srcSliceY和srcSliceH构成数据处理区,srcSliceY表示起始位置,srcSliceH表示处理的行数*/
int srcSliceH,/*可以使用多个线程加快处理过程,如创建两个线程,一个处理[0,2/h]行,另一个处理[h/2+1,h]行*/
uint8_t *const dst[],/*目标图像通道数据指针*/
const int dstStride[]/*目标图像每个颜色通道的跨度,行字节数*/);
/*返回值为转换后图像的高度*/
sws_scale() 函数主要是用来实现视频像素格式和分辨率的转换,优点在于在同一个函数中实现图像色彩空间转换、分辨率缩放、前后图像滤波处理;缺点就是效率相对较低
在调用sws_scale之前一般会使用av_image_fill_arrays()填充目标图像的缓存区,不然会导致sws_scale()转换失败
int av_image_fill_arrays(uint8_t *dst_data[4], /*图像data指针*/
int dst_linesize[4], /*data的宽度*/
const uint8_t *src, /*图像数据缓存区,大小为图像大小*/
enum AVPixelFormat pix_fmt, /* 像素格式*/
int width, /* 图像的宽度*/
int height, /* 图像的高度*/
int align /* 缓存区的对齐方式*/);
图像的大小一般使用av_image_get_buffer_size()函数获取