1 简述
AVSwscale 它是颜色转换,裁剪库。 比如将YUV 转 RGB... 。 本章我们探究的是关于AVSWscale 库API ,关于FFMPEG Swscale 内部实现请参考:https://blog.csdn.net/leixiaohua1020/article/details/44305697
2 使用流程
使用AVSWscale 库只有简单三步: 初始化,转换,退出。
2.1 初始化
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)
sws_getContext() 它是一个高度集成的API ,我们只需调用这一支API 即可完成初始化任务,输入参数比较多,我们需要将源/目的的宽高,像素格式信息传下去。flags 参数可选择转换算法。
这函数返回成功的话,会得到一个已初始化的SwsContext ,
2.2 转换
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[])
该函数,会根据已初始化过的SwsContext 会将srcSlice 存放的数据转化到dst 中。
c: 已初始化的SwsContext , 这个容易理解。
srcslice: 存放图像数据,也容易理解。
srcStride:就是linesize, 单个颜色分量每行的size, 比如一张320 * 240 的RGB图片,每个像素点都由RGB 组成,那么linesize[1],linesize[2],linesize[3]都是320 。 但是YUV420 各个像素的颜色分量就不会相等了。
srcSliceY,srcSliceH: 裁剪应该可以理解为两种情况:内容裁剪,降清晰度。
比如一张3840 *2160 的图片,如果居中需要裁剪成1920 * 1080, 那么srcSliceY = 960, srcSliceH = 1080。
同样一张3840 *2160 , 清晰度将为 1920 * 1080 , 那么srcSliceY = 0, srcSliceH = 2160。
dstStride:同srcStride
2.3 退出
sws_freeContext() : 调用这一支API 即可。
关于FFMPEG SWScale 使用, 请参考官方提供的demo: 在doc/examples 目录下的scaling_video.c
3 AVSwscale 库相关API
ffmpeg scale 算法库里面很庞大,内容也深。 如果只仅仅简单使用,只需掌握sws_getContext(),sws_scale()两支API 即可, 想深入的使用, 下列API 还待探究.
函数名 | 作用 |
unsigned swscale_version (void) | |
const char * swscale_configuration (void) | 返回libswscale生成时配置。 |
const char * swscale_license (void) | 返回libswscale许可证 |
const int * sws_getCoefficients (int colorspace) | 返回一个指针,指向适用于sws_setcolorspacedetails()的给定颜色空间的yuv<->rgb系数。 |
int sws_isSupportedInput (enum AVPixelFormat pix_fmt) | 如果pix_fmt是支持的输入格式,则返回正值,否则返回0 |
int sws_isSupportedOutput (enum AVPixelFormat pix_fmt) | 如果pix_fmt是支持的输出格式,则返回正值,否则返回0。 |
int sws_isSupportedEndiannessConversion (enum AVPixelFormat pix_fmt) | |
struct SwsContext * sws_alloc_context (void) | 分配一个空swscontext |
av_warn_unused_result int sws_init_context (struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter) | 初始化swscaler上下文sws_context。 |
void sws_freeContext (struct SwsContext *swsContext) | 初始化swscaler上下文sws_context。 |
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。 |
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[]) | 缩放srcslice中的图像切片,并将缩放后的切片放入dst中的图像中。 |
int sws_setColorspaceDetails (struct SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation) | |
int sws_getColorspaceDetails (struct SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation) | |
SwsVector * sws_allocVec (int length) | 分配并返回一个带有长度系数的未初始化向量。 |
SwsVector * sws_getGaussianVec (double variance, double quality) | 返回用于过滤填充质量的归一化高斯曲线= 3是高质量,较低是较低质量 |
void sws_scaleVec (SwsVector *a, double scalar) | 按标量值缩放a的所有系数。 |
void sws_normalizeVec (SwsVector *a, double height) | 缩放a的所有系数,使它们的总和等于高度。 |
void sws_freeVec (SwsVector *a) | |
SwsFilter * sws_getDefaultFilter (float lumaGBlur, float chromaGBlur, float lumaSharpen, float chromaSharpen, float chromaHShift, float chromaVShift, int verbose) | |
void sws_freeFilter (SwsFilter *filter) | |
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) | 检查上下文是否可以重用,否则重新分配一个新的上下文 |
void sws_convertPalette8ToPacked32 (const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette) | 将一个8位的淡色帧转换成一个32位色深的帧 |
void sws_convertPalette8ToPacked24 (const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette) | 将8位淡色帧转换为色深为24位的帧 |
const AVClass * sws_get_class (void) | 获取swscontext的avclass |