FFmpegを使用して多数のビデオファイルを変換する必要があります。すべてのファイルを適切に変換するBashファイルを実行しますが、変換されたファイルが16:9形式でない場合は問題があります。
画面のサイズを-s720x400に固定しているので、元のアスペクト比が4:3の場合、FFmpegは16:9の出力ファイルを作成し、アスペクト比を台無しにします。
アスペクト比をメインパラメータとして設定し、サイズを調整できる設定はありますか(たとえば、XまたはYの寸法のみを固定することによって)?
FFmpegを使用して多数のビデオファイルを変換する必要があります。すべてのファイルを適切に変換するBashファイルを実行しますが、変換されたファイルが16:9形式でない場合は問題があります。
画面のサイズを-s720x400に固定しているので、元のアスペクト比が4:3の場合、FFmpegは16:9の出力ファイルを作成し、アスペクト比を台無しにします。
アスペクト比をメインパラメータとして設定し、サイズを調整できる設定はありますか(たとえば、XまたはYの寸法のみを固定することによって)?
-vf "scale=640:-1"
エラーが発生するまでうまく機能します
[libx264 @ 0x2f08120] height not divisible by 2 (640x853)
したがって、最も一般的なアプローチは、フィルター式を使用することです。
scale=640:trunc(ow/a/2)*2
出力幅(ow)を取り、アスペクト比(a)で除算し、2で除算し、小数点以下の桁を切り捨てて2で乗算します。これにより、結果の高さが2で割り切れることが保証されます。
ffmpegtracへのクレジット
アップデート
コメントが指摘しているように、より簡単な方法はを使用すること-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"
ずっと前に聞いたことがありますが、実際には当時は知らなかった解決策があります。アスペクト比を維持するには、非常に強力なビデオフィルタースケールを使用する必要があります。フィルター。
次のように簡単に使用できます。
-vf "scale=640:-1"
これにより、アスペクト比を維持するために必要な幅と高さが固定されます。しかし、他の多くのオプションや数学関数を使用することもできます。こちらのドキュメントを確認してください-http://ffmpeg.org/ffmpeg.html#scale
これらの答えのほとんどは素晴らしいですが、アスペクト比を維持しながら、ターゲットの寸法(幅または高さ)にサイズ変更できるコマンドを探していました。私はffmpegの式評価を使用してこれを達成することができました。
ターゲットサイズが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)'
幅が高さより大きい場合は比例した高さを返し、そうでない場合はターゲットを返します。
ffmpeg tracforce_original_aspect_ratio
から、を使用します:
ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4
バウンディングボックスを取り付けようとしている場合は、xmedekoの回答force_original_aspect_ratio
に従って使用することをお勧めします。
ただし、入力ビデオのサイズがおかしく、サイズを2で割り切れる形式にエンコードしている場合、これは機能せず、エラーが発生します。
この場合、Charlieの回答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)
バウンディングボックス(ここから)内に収まるスケーリング係数を見つけ、それを最大1に制限して、ダウンスケールのみを保証します。trunc(<scaling factor>*iw/2)*2
そしてtrunc(<scaling factor>*iw/2)*2
、2で割って、結果を整数にしてから2を掛けて、次元が2で割り切れるのを確認します。これにより、エンコードする前に入力ビデオのサイズを見つける必要がなくなります。
ffmpeg -iを使用して元のファイルのサイズを取得し、それをエンコードのコマンドで使用できます。どのプラットフォームでffmpegを使用していますか?
'-aspect x:y'が存在し、出力ファイル形式がISO Media File Format(mp4)の場合、ffmpegはビデオトラックのstsd-boxにpasp-atom(PixelAspectRatioBox)を追加して、プレーヤーに予想されるアスペクト比を示します。プレーヤーは、それぞれビデオフレームをスケーリングする必要があります。アスペクト比に合わせるためにエンコードまたはトランスコードする前にビデオをスケーリングする必要はありません。プレーヤーが実行する必要があります。
ffmpegは幅/高さを2で割り切れる必要があり、次元の1つを指定したいと思うので、これはオプションになります。
ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
上記の回答は素晴らしいですが、それらのほとんどは特定のビデオサイズを想定しており、一般的なアスペクト比では機能しません。
これを使用して、特定の寸法に関係なく、任意のアスペクト比に合うようにビデオをパディングできます。
-vf 'pad=x=(ow-iw)/2:y=(oh-ih)/2:aspect=16/9'
私の例では比率を使用16/9
しています。上記は、次のようなより手動の操作を行うためのショートカットです。
pad='max(iw,(16/9)*ih)':'max(ih,iw/(16/9))':(ow-iw)/2:(oh-ih)/2
これにより、奇数サイズ(偶数ではない)のビデオサイズが出力される可能性があるため、出力が次のようになっていることを確認できます。
pad='trunc(max(iw,(16/9)*ih)/2)*2':'trunc(max(ih,iw/(16/9))/2)*2':(ow-iw)/2:(oh-ih)/2
しかし、本当に必要なのはpad=x=(ow-iw)/2:y=(oh-ih)/2:aspect=16/9
上記のすべての例で、INPUTビデオのサイズが奇数の場合はエラーが発生します。pad=iw:ih
入力が奇数サイズの場合でもエラーが発生します。通常、奇数サイズの入力はありませんが、入力する場合は、最初に次のフィルターを使用して修正できます。pad='mod(iw,2)+iw':'mod(ih,2)+ih'