一連の静止画像(道路に向けられた静止カメラ)をビデオに変換する必要があります。
Theora、H.264、VP8、VP9、HEVC、Snowなどのビデオコーデックを検討しました。
ビデオのサイズは最小で、画質は最大である必要があります。現在、使用可能なすべてのコマンドライン引数から、フレームレート(fps)、b:v
(ビットレート)、およびs
(幅*高さ)を使用しています。また、H.264とHEVCには、-crf
と-preset
があります。
私が求めていることを達成するために役立つ他のコマンドライン引数は何ですか? ffmpegでは、数十のコマンドライン引数とそれぞれの解析に長い時間がかかる場合があります。
最高の品質と最小のファイルサイズが必要な場合は、圧縮効率の高いコーデックを使用する必要があります。ただし、最初に、(数学的に)ロスレス、視覚的にロスレス、またはロッシーエンコードを実行するかどうかを検討する必要があります。
ロスレスエンコードはもちろんファイルサイズを大きくしますが、元のデータを保持するという利点があります。その後、品質を損なうことなく、ビデオから個々のフレームを抽出できます。ここでは、HuffYUVや FFV1 などのコーデックを使用できます。これらは、元の資料を保存する必要があり、 ジェネレーションロス を回避する必要があるアーカイブ目的でよく使用されます。 libx264
(H.264)、libx265
(HEVC)、およびlibvpx-vp9
は、ロスレスモードでも使用できます。
ffmpeg -i <input> -c:v huffyuv output.avi
ffmpeg -i <input> -c:v ffv1 output.avi
ffmpeg -i <input> -c:v libx264 -crf 0 output.mp4
ffmpeg -i <input> -c:v libx265 -x265-params lossless=1 output.mp4
ffmpeg -i <input> -c:v libvpx-vp9 -lossless 1 output.webm
視覚的にロスレスエンコードは一部のデータを破棄しますが、元のビデオとエンコードされたビデオの違いに人間が気付かないように品質を維持します。 ProRes( ここ を参照)などのいわゆる「中間」コーデックは、この目的でよく使用されます。 libx265
またはlibx264
を使用して、十分に低いCRF値( ここでのCRFの説明 )を指定することにより、視覚的にロスレスエンコードを行うこともできます。 x264の場合は10〜18。
ffmpeg -i <input> -c:v prores -profile:v 3 output.mov
ffmpeg -i <input> -c:v libx264 -crf 10 -preset ultraslow output.mp4
...
非可逆コーデック、たくさんあります。品質を犠牲にすることができれば、ファイルサイズを大幅に減らすことができます。 VP9とHEVCは、必要なスペースの量に関してH.264よりも効率的ですが、エンコードに時間がかかる場合があります。 TheoraとVP8を忘れてください。 VP9、HEVC、およびH.264(少なくともffmpegで利用可能なエンコーダーを使用)を使用すると、必要な品質を提供するCRFパラメーターを設定できます。出力を視覚的にチェックして、損失の量が目的に対して深刻すぎないことを確認する必要があります。 libx264
の場合、18〜23のCRF値は「良好」に見えます。
ffmpeg -i <input> -c:v libx264 -crf 23 -preset ultraslow output.mp4
ffmpeg -i <input> -c:v libvpx-vp9 -crf 10 -b:v 0 output.webm
...
一般に、コンテンツのアーカイブを目的としている場合は、ターゲットビットレートを指定するだけでは不十分です。代わりに、一定品質モードを使用する必要があります。このモードでは、エンコーダーは画像の品質を維持するために必要な数のビットを自由に使用できます(特定の範囲内)。特にH.264またはHEVCエンコーダーlibx264
およびlibx265
では、シングルパスエンコードに-b:v
を使用することは、時間の経過とともに大幅な品質変動につながる可能性があるため、お勧めしません。 (ここに 異なるレート制御 モードに関する記事を書きました。)要約すると、アーカイブしている場合は、一定のCRF値を選択するだけです。
また、ビデオのサイズを変更しないことも非常に重要です。サイズを変更すると、ぼやけが生じたり(アップスケーリングの場合)、データが破棄されたりするためです(ダウンスケーリングの場合)。画像がビデオに対して大きすぎる場合を除いて、-s:v
オプションを省略してください。
最後に、視覚的にロスレスまたはロスのあるエンコードを実行する場合、速度と圧縮効率のトレードオフを行うことができます。つまり、長く待つと、ファイルサイズを小さくすることができます。ここで、preset
オプションが機能します。ultraslow
のようなプリセットを選択すると、エンコードプロセスに長い時間がかかりますが、結果のファイル(特定のCRFを想定)は次のようになります。同じ品質ですが、小さいです。 VP9には、速度を制御するためのさまざまなオプションがあります。 ここ を参照してください。
もう1つ:libx264
を使用すると、 -tune stillimage
オプションを使用して、画像のエンコードを最適化できます。また、必要な最低フレームレートを選択すると、もちろんファイルサイズを節約できます。
いくつかのドキュメント: