关于对ffmpeg中SAR/DAR/PAR的理解

图一SAR: 相当于从原始图片中取出单位面积的S1的像素点渲染到播放器的S2中的宽高比。(上图SAR=4:3)
DAR: 相当于把原始图片中所有像素点按照SAR的值渲染到播放器中后播放器的宽高比。(上图DAR=16:9)
PAR: 相当于把原始图片中 (所有横向的像素点):(所有纵向的像素点)。(上图PAR=4:3)
DAR=PAR*SAR

首先通过ffmpeg生成一个视频素材 ffmpeg -filter_complex "color=d=5:s=640*360,drawtext=text='CCCC':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=180:fontcolor=white,scale=640*480,setsar=4/3[a]" -map "[a]" -y test.mp4
这里有一个640x480(test.mp4)的视频:root@zzz:/test/# ffproble test.mp4
在这里插入图片描述
从ffprole信息可以看出SAR=4:3 DAR=16:9
ffplay 的播放时如下:ffplay -x 640 test.mp4
请添加图片描述
可以看出播放是正常的。此时播放的大小是640*360。

当通过ffmpeg截图时 :
请添加图片描述

可以看出图片是有一定拉伸的。大小是640480。
所以实际存储的图片就是有拉伸的。为何播放时是正确的呢?
这是通过SAR告诉播放器如何去渲染
SAR相当于从原始图片中取出单位面积的S1的像素点渲染到播放器的S2中的宽高比:
4x4 → 4x3
横向渲染完需要640
纵向渲染完只需要480
3/4=360
SAR=4:3
播放时的宽高比:DAR=640:360=16:9

当我们把视频test.mp4的SAR设置成1:1时: ffmpeg -i test.mp4 -vf setsar=1 -y test2.mp4
在这里插入图片描述
此时可以看出:
DAR=4:3
SAR=1:1
这时的机制是:
4x4 → 4x4
横向渲染完需要640
纵向渲染完只需要480/SAR=480
所以DAR=640/480=4:3
因为在播放时要需要渲染整帧图的所有像素 ,而图片大小是已知的 所以在用setsar/setdar设置SAR/DAR时,任意设置一个值,另外一个值就确定了,比如设置了SAR,那么DAR=视频的宽/视频的高*SAR。

当使用浏览器查看图片时,不会用DAR和SAR,如果想截图正常展示时,我们对视频进行缩放.
直接把原视频缩放到播放时的大小: ffmpeg -i test.mp4 -vf scale=w=iw:h=ih/SAR a.mp4
注:运行时SAR替换成具体值
在这里插入图片描述
此时播放和截图都是正常的。

先已知视频c.mp4正常播放时的宽高比为16:9,S=320x1080,DAR=8:27,如何才能使截图和播放都正常?
在这里插入图片描述
SAR=DAR/PAR=16/9/320*1080=6

ffmpeg -i c.mp4 -vf scale=w=iw:h=ih/6,setsar=1 -y out.mp4

以上仅为个人理解,如有错位请纠正!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值