FFmpeg を使用してビデオのサイズ変更/拡大/縮小/解像度を簡単に変更
この FFmpeg チュートリアルでは、FFmpeg のコマンド ライン ツールを使用してビデオの解像度を変更する (またはビデオのサイズ変更/拡大縮小する) 方法を学びます。
ビデオの解像度の変更 (サイズ変更またはスケーリングとも呼ばれます) は、ビデオの編集、処理、圧縮において非常に一般的な操作です。これは、単一のビデオがソースとして取得され、複数の異なるビットレート解像度の組み合わせに圧縮される ABR ビデオ ストリーミングに特に当てはまります。たとえば、入力ビデオ解像度は1920x1080
、ABR ビットストリームは1280x720
、 640x480
などにすることができます。
したがって、最初のステップとして、入力ビデオの解像度を調べてみましょう。 FFmpeg バージョンに付属するツールffprobe
を使用して、入力ビデオの解像度を決定してみましょう。これはffprobe
を使用して行われます。
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
このコマンドの出力は、コンソールに表示される1920x1080
と一致する必要があります。素晴らしいです。ビデオの解像度がわかり、解像度を拡大縮小したり変更したりできるようになりました。
注:スケールアップ/スケールダウンの操作は損失を伴うプロセスであり、ビデオ品質がある程度低下することに注意する必要があります。
FFmpeg を使用してビデオの解像度を調整/スケーリング/変更するにはどうすればよいですか?
FFmpeg を使用したビデオのスケーリングまたは解像度の変更は、FFmpeg のscale
フィルターによって行われます。 scale
フィルターを使用するには、次のコマンドを使用します。
ffmpeg -i input.mp4 -vf scale=$w:$h <encoding-parameters> output.mp4
このうち$w
と$h
対象動画の必要な幅と高さを表します。たとえば、 -vf scale=640:480
を使用してビデオのサイズを480p
に変更できます。
それだけです!この簡単なコマンドで、FFmpeg を使用してビデオの解像度を変更できます。
また、FFmpeg はビデオの解像度を変更した後、その解像度で再エンコードします。上記のコマンド ラインでは、FFmpeg にエンコード パラメータを指定し、これらのパラメータを使用してスケーリングされたビデオをエンコードできます。たとえば、高品質の H.264/AVC エンコードを実現するために crf=18 でエンコードするように FFmpeg に指示したり、別のエンコードを選択したりすることができます。
さて、次のトピックに取り組みましょう。ビデオの解像度は変更しますが、そのアスペクト比を保持/維持することです。
FFmpeg を使用して高品質を維持しながらビデオのサイズを変更する方法
サイズを変更すると、出力ビデオの品質が低下したり、期待したものと異なったりする場合があります。この問題は、サイズ変更プロセスの後に使用したいビデオ エンコード パラメータを FFmpeg に伝えることで簡単に解決できます。
ここに例があります –
ffmpeg -i input.mp4 -vf scale=1280:720 -preset slow -crf 18 output.mp4
ここでは、ビデオを 720p にスケールし、 crf=18
とlibx264
の低速プリセットを使用してエンコードするように FFmpeg に指示しています。オープンするエンコード ツールの数により、通常は非常に高い品質が得られます。
アスペクト比を維持しながらビデオの解像度を変更するにはどうすればよいですか?
画像のアスペクト比は、Wikipedia で次のように定義されています。画像のアスペクト比は、画像の幅と高さの比です。通常、 16:9
のように、コロンで区切られた 2 つの数値として表されます。x x:y
アスペクト比では、画像の幅は x 単位、高さは y 単位になります。
ビデオを操作するときに、ビデオの元のアスペクト比を維持または維持しながら、ビデオの解像度を変更 (またはビデオの拡大縮小) する方法についての質問に遭遇することがよくあります。
FFmpeg では、アスペクト比を維持しながらビデオを拡大縮小する場合は、 height
またはwidth
パラメーターのいずれかを設定し、もう一方のパラメーターを-1
に設定する必要があります。つまり、 height
を設定した場合は width を-1
に設定し、その逆も同様です。
デモンストレーションの目的で、次のコマンドが入力として HD ビデオ ( 1920x1080
) を受け取ると仮定します。そして、解像度を変更したいとします。これは上で説明した 2 つの方法で行うことができるので、両方の方法を試してみましょう。
1. アスペクト比を維持するために幅を指定します
ffmpeg -i input.mp4 -vf scale=320:-1 output.mp4
結果のビデオの解像度は320x180
になります。これは1920 / 320
= 6
であるためです。したがって、 height
1080 / 6 = 180
ピクセルにスケールされます。
2. アスペクト比を維持するために高さを指定します
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
結果のビデオの解像度は1280x720
になります。これは、 1080 / 720
= 1.5
あるためです。したがって、 width
1920 / 1.5 = 1280
ピクセルにスケールされます。
変数を使用して FFmpeg でビデオの解像度をスケーリング/変更する
ビデオパラメータを表す変数を使用して、同じズームコマンドを実装できます。入力ビデオのwidth
とheight
それぞれiw
とih
で表します。
ビデオの幅を 2 倍 ( 2x
) に拡大するコマンドがどのようなものかを見てみましょう。
ffmpeg -i input.mp4 -vf scale=iw*2:ih output.mp4
高さまたは幅を数値で除算する場合は、 scale=iw/2:ih/2
パラメーターを二重引用符で囲む必要があるため、構文が若干変更されます。
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4
入力ビデオ サイズに基づいてビデオをアップスケーリングしないようにする
記事の冒頭で述べたように、各アップ/ダウン ズーム操作では、通常、入力ビデオと同じレベルのビデオ品質は生成されません。スケーリング プロセス中には、ある程度の圧縮損失が必ず発生します。 FFmpeg は、入力解像度が低すぎる場合にアップスケーリングを防ぐ賢いトリックを提供します。
ffmpeg -i input.mp4 -vf "scale='min(320,iw)':'min(240,ih)'" output.mp4
上記のコマンド ラインでは、スケーリングを実行するための最小の幅/高さはそれぞれ320
と240
ピクセルに設定されています。これは、低品質のスケーリングを防ぐ非常に簡単な方法です。