FFmpeg设置视频的显示宽高比例display_aspect_ratio

最近采用ffmpeg编写代码的时候,发现视频播放的宽高比例不是我想要的,所以我需要调整显示的宽高比。

一般采用ffplay播放视频的时候,会出现SAR和DAR

其中他们之间的概念是

DAR,Display_aspect_ratio,是指定该视频播放的时候,看到的视频比例。
SAR,Sample Aspect Ratio,是指采集这个视频的比例,也就是存储像素点的比例。

我发现在AVCodecContext中只有sample_aspect_ratio

而在AVStream中有sample_aspect_ratio和display_aspect_ratio

兴冲冲的都设置成16::9,结果是失败的,比例还是没变。

一番折腾后,在源码中的函数avcodec_string中找到了DAR的来源

FFmpeg设置视频的显示宽高比例display_aspect_ratio_第1张图片

(图里的enc在我这里是AVCodecContext,有的版本可能是AVCodecParameters,一样的)

发现怎么放16:9都得不出正确的数值,那只能稍微看下av_reduce这个函数怎么算的了

不要被吓到,其实很简单,把你的数值带入,然后设定你想要输出的比例,就可以计算出了

简化出来就是

x=N/D

a2n=x*N

a2d=x*D+1

我这里352*288是我的分辨率,n:d是我应该设置enc->sample_aspect_ratio的值。a2n:a2d就是我最后想要的比例16:9。

所以代入N=352*n,D=288*d。a2n=16,a2d=9。

最后算出来n/d=1.45454545......,而这个正好是16/11的值。

所以我要设置我的enc->sample_aspect_ratio里分别为16:11 即可,验证成功。

虽然一开始如果注意到一开始的图片里的SAR的值是16:11,可能就不用走这弯路,哈哈,不过用时不久,也算彻底感悟这个DAR的来源。

就这样啦,下班啦!

 

你可能感兴趣的:(ffmpeg,ffmpeg)