FFmpeg API 之 libswscale

libswscale 库用来做图片转化。

我们在处理图片数据时,经常有诸如缩放尺寸,转化像素格式的需求。这些操作较为简单,在 FFmpeg 中是非常常见的操作,其效率对 FFmpeg 影响较大。因此,FFmpeg 提供了 libswscale 库。

 

当我们获取到一个视频 Frame 后,相关的视频数据都存放在这个帧中(详情见AVFrame一节)。我们知道linesize 字段中保存了图片的每行的字节大小,因此,在 Frame 中,图片自然以行为基本单位进行操作,这点在转化中体现的比较明显。

 

libswscale 库对于用户来说,需要知道的东西不多。SwsContext 是 libswscale 中执行图片转化的结构体,图片转化的操作围绕它展开。

以下是其相关函数:

struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
                                  int dstW, int dstH, enum AVPixelFormat dstFormat,
                                  int flags, SwsFilter *srcFilter,
                                  SwsFilter *dstFilter, const double *param);

/*
	分配并返回一个可用的SwsContext,然后使用sws_scale()来执行转换操作。
	
	前三个参数指定源图片的width,height,format
	后三个参数指定目标图片的width,height,format
	后面的四个参数我们不需关心,一律置0或者NULL
	
	成功返回分配的SwsContext,失败返回NULL
*/


struct SwsContext *sws_getCachedContext(struct SwsContext *context,
                                        int srcW, int srcH, enum AVPixelFormat srcFormat,
                                        int dstW, int dstH, enum AVPixelFormat dstFormat,
                                        int flags, SwsFilter *srcFilter,
                                        SwsFilter *dstFilter, const double *param);
/*
	检测传入的context是不是可以复用,如可以直接返回context,如果不行,重新分配一个。
	
	如果分配context时的参数和此时传入的参数相同(不包括srcFilter和dstFilter),则可复用;
	如果不同,则不可复用,此时释放context,然后重新分配一个SwsContext。
*/
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
              const int srcStride[], int srcSliceY, int srcSliceH,
              uint8_t *const dst[], const int dstStride[]);
/*
	对图片执行scale操作。
	
	c:要使用的SwsContext
	srcslice:保存源图片数据的平面缓存区的指针数组,即Frame.data
	srcStride:保存源图片平面数据的行尺寸,即Frame.linesize
	srcSliceY:从第几行开始做scale操作
	srcSliceH:一共要做scale操作的行数,配合上一个参数,表示对从第srcSliceY行开始的srcSliceH行图片做转化操作
	dst:同srcSlice,但指向目标图片
	dstStride:同srcStride,但指向目标图片

        返回值:转化后dst图片的height
*/
void sws_freeContext(struct SwsContext *swsContext);
/*
	释放SwsContext。
*/

以上,就是使用 libswscale 库所需知道的全部内容。

你可能感兴趣的:(FFmpeg,API,详解)