Ffmpegを使用して多数のビデオファイルを変換する必要があります。すべてのファイルを適切に変換するbashファイルを実行しますが、変換されたファイルが16:9形式でない場合は問題があります。画面のサイズを-s 720x400に固定しているため、元のアスペクト比が4:3の場合、ffmpegは16:9出力ファイルを作成し、アスペクト比をねじ込みます。
縦横比をメインパラメータとして設定でき、サイズを調整できますか(たとえば、XまたはY寸法のみを固定することにより)。
私はずっと前にこれを尋ねましたが、実際には当時知られていない解決策があります-アスペクト比を維持するには、ビデオフィルタースケールを使用する必要があります。これは非常に強力ですフィルタ。
次のように単純に使用できます。
-vf "scale=640:-1"
幅を固定し、アスペクト比を維持するために必要な高さを提供します。しかし、他の多くのオプションや数学関数を使用することもできます。こちらのドキュメントを確認してください- http://ffmpeg.org/ffmpeg.html#scale
-vf "scale=640:-1"
エラーが発生するまでうまく機能します
[libx264 @ 0x2f08120] height not divisible by 2 (640x853)
したがって、最も一般的なアプローチは、フィルター式を使用することです。
scale=640:trunc(ow/a/2)*2
出力幅(ow)を取り、アスペクト比(a)で除算し、2で除算し、小数点以下を切り捨て、2で乗算します。結果の高さが2で割り切れることを保証します。
ffmpeg trac へのクレジット
[〜#〜] update [〜#〜]
コメントが指摘したように、より簡単な方法は-vf "scale=640:-2"
を使用することです。エレガントなソリューションに対する@BradWerthの功績
例えば:
1920x1080アスペクト比16:9 => 640x480アスペクト4:3:
ffmpeg -y -i import.media -aspect 16:9 scale=640x360,pad=640:480:0:60:black output.media
アスペクト比16:9、サイズ幅640ピクセル=>高さ360ピクセル:
最終出力サイズが640x480で、60ピクセルの黒の画像を埋める(上下):
"-vf scale=640x360,pad=640:480:0:60:black"
これらの答えのほとんどは素晴らしいですが、アスペクト比を維持しながらターゲットの寸法(幅or高さ)にサイズ変更できるコマンドを探していました。 ffmpegの Expression Evaluation を使用してこれを達成できました。
ターゲットディメンションが512の関連するビデオフィルターは次のとおりです。
-vf "thumbnail,scale='if(gt(iw,ih),512,trunc(oh*a/2)*2)':'if(gt(iw,ih),trunc(ow/a/2)*2,512)'"
出力幅の場合:
'if(gt(iw,ih),512,trunc(oh*a/2)*2)'
幅が高さより大きい場合はターゲットを返し、そうでない場合は比例幅を返します。
出力の高さ:
'if(gt(iw,ih),trunc(ow/a/2)*2,512)'
幅が高さよりも大きい場合は、比例した高さを返します。それ以外の場合は、ターゲットを返します。
つかいます force_original_aspect_ratio
、 ffmpeg trac から:
ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4
バウンディングボックスを合わせようとしている場合は、 xmedekoの答え に従って_force_original_aspect_ratio
_を使用するのが良い出発点です。
ただし、入力ビデオのサイズがおかしいおよびで、2で割り切れるサイズを必要とする形式にエンコードしている場合、これは機能しません。エラーで。
この場合、 Charlie's answer で使用されるような式評価をscale
関数で使用できます。
720x400の出力バウンディングボックスを想定:
-vf "scale='trunc(min(1,min(720/iw,400/ih))*iw/2)*2':'trunc(min(1,min(720/iw,400/ih))*ih/2)*2'"
これを分解するには:
min(1,min(720/iw,400/ih)
は、バウンディングボックス内に収まるスケーリングファクターを見つけ( here から)、最大1に制限して、ダウンスケールのみを保証します。trunc(<scaling factor>*iw/2)*2
およびtrunc(<scaling factor>*iw/2)*2
は、結果を整数にして2で乗算することにより、次元を2で割り切れるようにします。これにより、エンコードする前に入力ビデオのサイズを見つける必要がなくなります。
ffmpeg -iを使用して元のファイルのサイズを取得し、エンコード用のコマンドでそれを使用できます。どのプラットフォームでffmpegを使用していますか?