不同的视频播放器在 ffmpeg 转换后显示不正确的 mp4 分辨率

Different video players showing incorrect mp4 resolution after ffmpeg conversion

获得有关如何将 webm 转换为 mp4 的帮助后。通过 -vf scale=-2:720.

设置高度分辨率避免丢失视频比例的结果

然后我遇到了另一个问题。我发现视频播放器必须同时支持宽度和高度,而我认为这只是必须指定的高度。

四处浏览后我发现这个脚本 我可以将视频的 canvas 更改为通用的宽度和高度标准。如果我是正确的,它会缩小视频以适应指定 canvas 的中心而不会丢失比例,同时用黑色填充填充空的 space,这就是我想要的结果。

不过,虽然解决了所有播放器的播放问题,但我发现不同的视频播放器显示同一个视频的分辨率信息不同。

我已经修改了此处的脚本以供 Linux 终端使用。

X=1280; Y=720; ffmpeg -i old.webm -t 5 -vf "scale=min(iw*$Y/ih\,$X):min($Y\,ih*$X/iw),pad=$X:$Y:($X-iw)/2:($Y-ih)/2" new.mp4

这是对我设置的值的分辨率差异的研究。

X=1280; Y=720;

webm          -> mp4
=========================================================
1280x752      -> 1280x720 X-plore (Android)
Not supported -> 1339x720 Telegram (Android)
1338x752      -> 1340x720 GNOME MPlayer (Linux)
Not supported -> ???????? Built-in Video Player (Android)

问题是,我在将 ffmpeg 转换为 return 不同播放器的不正确分辨率方面做错了什么?我查看了其他一些我拥有的视频,它们显示了正确的分辨率,除了这个转换后的视频。

编辑

借助已接受的答案。如果有人需要,这是我的工作输出:

X=1280; Y=720; ffmpeg -i input.webm -vf "scale='if(gt(a*sar,16/9),${X},${Y}*iw*sar/ih)':'if(gt(a*sar,16/9),${X}*ih/iw/sar,${Y})',pad=${X}:${Y}:(ow-iw)/2:(oh-ih)/2,setsar=1" output.mp4

pad后加setsar=1

此外,您的比例表达式不考虑具有非方形像素的视频。使用此 answer.

中的表达式