FFMPEG 之 AVSwscale

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值