libswscale图像格式转换与放大缩小

缩放,例如640x360 拉伸 为1280x720
注意:没有裁剪!
========================
有2种使用方法:
简单的初始化方法
(1)       sws_getContext():使用参数初始化SwsContext结构体。
(2)       sws_scale():转换一帧图像。
(3)       sws_freeContext():释放SwsContext结构体。
其中sws_getContext()也可以用sws_getCachedContext()取代。

更灵活的初始化方法, 可以配置更多的参数:
(1)       sws_alloc_context():为SwsContext结构体分配内存。
(2)       av_opt_set_XXX():通过av_opt_set_int(),av_opt_set()…等一系列方法设置SwsContext结构体的值。在这里需要注意,SwsContext结构体的定义看不到,所以不能对其中的成员变量直接进行赋值,必须通过av_opt_set()这类的API才能对其进行赋值。
(3)       sws_init_context():初始化SwsContext结构体。
这种复杂的方法可以配置一些sws_getContext()配置不了的参数。比如说设置图像的YUV像素的取值范围是JPEG标准(Y、U、V取值范围都是0-255)还是MPEG标准(Y取值范围是16-235,U、V的取值范围是16-240)。

可以通过使用av_opt_set()设置“src_range”和“dst_range”来设置输入和输出的YUV的取值范围。如果“dst_range”字段设置为“1”的话,则代表输出的YUV的取值范围遵循“jpeg”标准;如果“dst_range”字段设置为“0”的话,则代表输出的YUV的取值范围遵循“mpeg”标准。





img_convert_ctx =sws_alloc_context();  

av_opt_set_int(img_convert_ctx, "sws_flags" ,SWS_BICUBIC|SWS_PRINT_INFO,0);  
 av_opt_set_int(img_convert_ctx, "srcw" ,src_w,0);  
 av_opt_set_int(img_convert_ctx, "srch" ,src_h,0);  
 av_opt_set_int(img_convert_ctx, "src_format" ,src_pixfmt,0);  
av_opt_set_int(img_convert_ctx, "src_range" ,1,0);  
 av_opt_set_int(img_convert_ctx, "dstw" ,dst_w,0);  
av_opt_set_int(img_convert_ctx, "dsth" ,dst_h,0);  
av_opt_set_int(img_convert_ctx, "dst_format" ,dst_pixfmt,0);  
 av_opt_set_int(img_convert_ctx, "dst_range" ,1,0);  
sws_init_context(img_convert_ctx,NULL,NULL);  
==============================


算法性能测试:
缩小:
SWS_POINT   每秒钟可缩放约427次     效率之高,让我震撼,但效果却 不差
SWS_FAST_BILINEAR   228次

放大
SWS_POINT  112次,边缘有明显锯齿
SWS_FAST_BILINEAR 103次,效果不错

建议, 在不明确是放大还是缩小时,直接使用SWS_FAST_BILINEAR算法即可。
如果明确是要缩小并显示,建议使用Point算法

FFmpeg使用不同sws_scale()缩放算法的命令示例
  1. ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv  
  2. ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bicubic -pix_fmt yuv420p src01_bicubic_1280x720.yuv  
  3. ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags neighbor -pix_fmt yuv420p src01_neighbor_1280x720.yuv  




参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值