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

关于对ffmpeg中SAR/DAR/PAR的理解_第1张图片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
关于对ffmpeg中SAR/DAR/PAR的理解_第2张图片
从ffprole信息可以看出SAR=4:3 DAR=16:9
ffplay 的播放时如下:ffplay -x 640 test.mp4
关于对ffmpeg中SAR/DAR/PAR的理解_第3张图片
可以看出播放是正常的。此时播放的大小是640*360。

当通过ffmpeg截图时 :
关于对ffmpeg中SAR/DAR/PAR的理解_第4张图片

可以看出图片是有一定拉伸的。大小是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
关于对ffmpeg中SAR/DAR/PAR的理解_第5张图片
此时可以看出:
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替换成具体值
关于对ffmpeg中SAR/DAR/PAR的理解_第6张图片
此时播放和截图都是正常的。

先已知视频c.mp4正常播放时的宽高比为16:9,S=320x1080,DAR=8:27,如何才能使截图和播放都正常?
关于对ffmpeg中SAR/DAR/PAR的理解_第7张图片
SAR=DAR/PAR=16/9/320*1080=6

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

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

你可能感兴趣的:(ffmpeg,ffmpeg,dar/sar/par)