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的来源

(图里的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的来源。

就这样啦,下班啦!

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值