从https://stackoverflow.com/a/40601020/6318164获取有关如何将webm转换为mp4的帮助。通过使用-vf scale=-2:720
设置高度分辨率,可以避免丢失视频比率。
然后我遇到了另一个问题。我发现视频播放器必须支持宽度和高度,我认为这只是必须指定的高度。
浏览后我发现这个脚本https://stackoverflow.com/a/35487394/6318164是我可以将视频的画布更改为常用的宽度和高度标准。如果我正确的话,它会缩小视频以适应指定画布的中心而不会丢失比例,同时用黑色填充填充空白空间,这是我想要的结果。
然而,虽然它解决了所有播放器的播放问题,但我发现不同的视频播放器显示同一视频的不同分辨率信息。
我在这里修改了脚本以供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转换做错了,为不同的玩家返回错误的分辨率?我检查了一些其他视频,他们显示正确的分辨率,除了这个转换过的。
修改
在接受的答案的帮助下。如果有人需要,这是我的工作输出:
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