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  




参考
http://blog.csdn.net/leixiaohua1020/article/details/42134965 有各种yuv的读取与写入方法
http://blog.csdn.net/leixiaohua1020/article/details/14215391 有保存各种yuv和rgb的方法
算法性能测试

你可能感兴趣的:(未分类,编解码)