假设我有两个视频文件 A 和 B。
现在我想将 A 转换为与 B 相同的格式(即相同的容器、相同的音频和视频编解码器)、相同的比特率、大小等。
有没有办法使用命令行工具(甚至 GUI 工具)自动执行此操作(即无需手动提取信息并将其作为输入参数手动提供)?
答案1
我认为如果您解析 ffmpeg 输出,您可以部分实现这一目标,但请注意有关如何编码以获得最佳结果的迷宫文档。这有点棘手。
也许另一种方法是找到一个可以将参数设置为一个的通用标准,并让转码器作业在所有 A、B 等上运行。
答案2
否 不可能所有参数都与 B 相同。我们需要对视频 A 的某些属性进行折衷或调整,使视频 A 的其他属性与视频 B 匹配。
答案3
那么你就可以制作自己的分析仪了。
您可以使用 ffmpeg(ffmpeg 的路径是 $exe)与 grep/sed/awk 管道将信息提取到变量中,使用 if-elif 构造($A 是文件 A 的路径)
以下示例获取视频编解码器、视频分辨率、帧速率并重置为不大于 24 fps,并获取音频编码频率。
videoa=`$exe -i $A 2>&1 | grep Stream.*Video | sed -e 's/.*Video: //' -e 's/[, ].*//'`
if [ $videoa = "h264" ];then videob="-c:v libx264"
elif [ $videoa = "hevc" ];then videob="-c:v libx265"
fi
resolution=$($exe -i "$f" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+')
crop="crop=960:544:0:2,"
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p") | awk '{printf "%.0f\n", $1}';) -gt 24 ];then r="-r 24";else r=""; fi
if [ $(echo $($exe -i "$f" 2>&1 | sed -n "s/.*, \(.*\) Hz.*/\1/p") | awk '{printf "%.0f\n", $1}';) -gt 44100 ];then af="-ar 44100";else af=""; fi
video="-map_chapters -1 -map_metadata -1 -vf ${crop}scale=${resolution},setsar=1/1,setdar=16/9 $videob -an $r"
$exe -y -ss $ss -i "$f" -t $t -map 0:v:0 $video $v