web-dev-qa-db-ja.com

FFMPEGアスペクト比の維持

Ffmpegを使用して多数のビデオファイルを変換する必要があります。すべてのファイルを適切に変換するbashファイルを実行しますが、変換されたファイルが16:9形式でない場合は問題があります。画面のサイズを-s 720x400に固定しているため、元のアスペクト比が4:3の場合、ffmpegは16:9出力ファイルを作成し、アスペクト比をねじ込みます。

縦横比をメインパラメータとして設定でき、サイズを調整できますか(たとえば、XまたはY寸法のみを固定することにより)。

41
0-alpha

私はずっと前にこれを尋ねましたが、実際には当時知られていない解決策があります-アスペクト比を維持するには、ビデオフィルタースケールを使用する必要があります。これは非常に強力ですフィルタ。

次のように単純に使用できます。

-vf "scale=640:-1" 

幅を固定し、アスペクト比を維持するために必要な高さを提供します。しかし、他の多くのオプションや数学関数を使用することもできます。こちらのドキュメントを確認してください- http://ffmpeg.org/ffmpeg.html#scale

20
0-alpha
-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の功績

58
mente

例えば:

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"
28
cool2ikou

これらの答えのほとんどは素晴らしいですが、アスペクト比を維持しながらターゲットの寸法(幅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)'

幅が高さよりも大きい場合は、比例した高さを返します。それ以外の場合は、ターゲットを返します。

9
Charlie

つかいます force_original_aspect_ratioffmpeg trac から:

ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4
9
xmedeko

バウンディングボックスを合わせようとしている場合は、 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で割り切れるようにします。

これにより、エンコードする前に入力ビデオのサイズを見つける必要がなくなります。

6
tvStatic

ffmpeg -iを使用して元のファイルのサイズを取得し、エンコード用のコマンドでそれを使用できます。どのプラットフォームでffmpegを使用していますか?

0
box86rowh