ffmpegを使用して、ビデオファイルのいくつかのダウングレードバージョンを作成しようとしています。コマンドラインから次のコマンドを使用しています(コマンドは ドキュメント から取得されます):
ffmpeg -i ../../tos.avi -b:v 500k tos_500k.avi
2000 kbps未満(〜125 kbpsまで)のいくつかの値でこれを試していますが、生成されたビデオファイルを確認したときに実際に生成される下限は約2000kbpsです。ソフトウェアを使用して値をチェックしています videospec 。
[編集]もう少し正確に言うと、私の元のビデオの解像度は1920x1080で、ビットレートは約15Mbpsです。上記のコマンドを使用すると、問題なく8000、5000などのより大きなビットレートに2000kbpsまでダウングレードできます。ただし、2000未満のものは処理されないようであり、結果の出力ファイルは常に2000kbpsを少し超えるビットレートでスタックします。 (ファイルサイズも、2000 kbpsに正常にダウングレードされたファイルに非常に近いです。)
ファイルを再エンコードするときは、ビットレートを指定するだけではいけません。私の推測では、ffmpegはデフォルトでmpeg4コーデックを使用しようとしますが、このような高解像度では下に移動できないため、2mbps未満の使用を拒否します。
このようにできるH.264コーデックで再エンコードすることをお勧めします:
ffmpeg -i ../../tos.avi -c:v libx264 -b:v 500k tos_500k.mp4
ただし、これは1パスの平均ビットレート方式を使用するため、品質がかなり低下することに注意してください。代わりに、「一定のレート係数」を使用してエンコードする必要があります。つまり、特定の品質をターゲットにし、エンコーダーがファイルに最適な平均ビットレートを決定します。
ffmpeg -i ../../tos.avi -c:v libx264 -crf 23 tos_500k.mp4
Crf値を自由に試すことができます。増加するとビットレートが低下し、品質が低下し、その逆も同様です。
どうしても平均ビットレートをターゲットにしたい場合は、チェックアウトする必要があります 2パスエンコーディング 。また、 プリセット についても忘れないでください!
ちなみに、1080pの500kは低すぎるため、結果が悪くなります。このような低いビットレートをターゲットにする場合は、480p(854x480)にダウンスケールすることをお勧めします。 720pのビットレートは1.5mbps以上、1080pは3mbps以上である必要があります。
将来の質問のために、ffmpegからの入出力ログを投稿することを忘れないでください。それらは常に役に立ちます:-)。
500KはH264またはH265の前夜に1080pの解像度には十分ではありません。大きなフレームサイズを満たすのに十分なデータがないため、画質が悪くなります。@ Elyが述べているように、最近のバージョンのffmpegでもエンコーダを指定する必要があります。ファイル拡張子を.mp4として指定した場合、デフォルトでh264を使用します。変換コマンドは次のようになります:-
ffmpeg -i ../../tos.avi -s 640x360 -v:c libx264 -b:v 500k tos_500k.mp4
より多くの圧縮とサイズの可能な限り最高の品質での取引が必要な場合は、各フレームステータスに応じてビットレートを分散しようとするため、2パス変換方法でcrf
Constant Rate Factor
を使用します(高速シーンの移動) )はより多くのビットレートを取得します。
ffmpeg -y -i ../../tos.avi -s 640x360 -c:v libx264 -crf 23 -pass 1 -c:a aac -f mp4 /dev/null && \
ffmpeg -i ../../tos.avi -s 640x360 -c:v libx264 -crf 23 -pass 2 -c:a aac tos_500k.mp4
それでもファイルサイズに満足できない場合は、〜27に達するまでcrf値を増やします