2つのビデオファイルAとBがあるとしましょう。
これで、AをBと同じ形式(たとえば、同じコンテナ、同じオーディオおよびビデオコーデック)、同じビットレート、サイズなどに変換したいと思います。
コマンドラインツール(またはGUIツール)を使用して自動化する方法はありますか(つまり、情報を手動で抽出して手動で入力パラメータとして提供せずに)。
答え1
ffmpeg出力を解析すると、部分的にこれを達成できると思いますが、最良の結果を得るためにエンコードする方法についてのドキュメントの迷路を知っておく必要があります。これは少しトリッキーです。
おそらく別のアプローチは、パラメータを1つに設定し、すべてのA、Bなどでトランスコーダタスクを実行できる共通の標準を見つけることです。
答え2
いいえすべてのパラメータはBと同じではありません。ビデオAの他のプロパティがビデオBと一致するように、ビデオAの一部のプロパティをトレードオフまたは調整する必要があります。
答え3
その後、独自のアナライザを作成できます。
if-elif 構成 ($A はファイル A のパス) を使用して、grep/sed/awk パイプラインとともに ffmpeg (ffmpeg パスは $exe) を使用して情報を変数として抽出できます。
次の例では、ビデオコーデック、ビデオ解像度、フレームレートを取得し、それを24fps以下にリセットし、オーディオエンコーディング周波数を取得します。
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