トランスコーディングにはffmpegとトランスコーディングスクリプトを使用しており、トランスコーディングに使用できるバッチファイルをいくつか作成したいと考えています。
たとえば、video_kbit
というパラメータを使用し、30000で書き込んでいる場合は、30Mビットに達するはずです。もちろん、パラメータとして6000
を使用すると、6 MBitにも達するはずなので、必要なすべてのビデオビットレートに達する1つのスクリプトがあります。
現在の設定では、18.1Mbitにしか達していません。パラメータとして15000を使用した場合にのみ、15MBitの一定のビデオビットレートという目標を達成しています。パラメータとして8000を使用すると、結果として10.1MBitが得られます。したがって、15000未満ではビットレートが高くなり、15000を超えるとビットレートが低くなります。
私のプリセットは次のとおりです。
ffmpeg -threads "4" -i "$2" -f mp4 -c:v libx264 -crf 1 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-acodec libfaac -ac 2 -ab ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -vf scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"
そして私はこれらのパラメータを使用しています:
FC_PARAM_video_kbit = 30000
FC_PARAM_audio_kbit = 192
FC_PARAM_width = 1920
FC_PARAM_height = 1080
より高いbufsizeを使用し、profile:v
とレベル設定を使用しようとしましたが、30000Mbitの一定のビデオビットレートに近づくことはできませんでした。
私の目標を達成するためのより良い方法について何かアイデアや提案がありますか?
CRF(a 一定品質モード )とビデオビットレートを同時に設定しても意味がありません。どちらか一方だけが必要です。
固定ビットレートを実現するには、 設定する必要がありますminrate
、maxrate
、およびb:v
同じ値に。スクリプトは次のようになります(ただし、理想的にはbufsize
も変更します)。
ffmpeg -threads "4" -i "$2" -c:v libx264 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-minrate ${FC_PARAM_video_kbit}k -b:v ${FC_PARAM_video_kbit}k \
-c:a libfaac -ac 2 -b:a ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -filter:v scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"
しかし、繰り返しになりますが、これは理にかなっていますか?問題は、あなたが本当に達成する必要があることです。より良い視覚的品質を提供しない(そしてより大きなファイルサイズのみを提供する)場合、高いビットレートを強制することに意味があることはめったにありません。 x264ビデオに30MBit/sが必要なのは、たとえ1080p HDコンテンツであっても、私には少しやり過ぎのように思えます。*
x264は、CRFを十分に低く設定した場合に、非常に優れた品質を提供するのに最適です。 17または18未満のものは、視覚的な歪みの観点からは目立たないはずです。CRFが0の場合は、ロスレスエンコーディングを意味します。むしろ、CRFを適切に見える値に設定し、ビットレートについて心配する必要はありません。これは、実際には、ビデオのバッチに適用して同様の品質の出力を実現できる、セットアンドフォーゲットタイプのオプションとして意図されています。
最後に、たとえば、ビデオの1秒をロスレスで(つまりCRF 0で)10 MBitに圧縮できる場合、ビットレートを30 MBit/sに設定しても、ビデオのこの部分が実際に強制されることはありません。 30MBitを消費します。 x264は、要求されたビットレートに出力を肥大化させるためだけに情報を「作成」しません。 10MBitのままになります。
*さらに処理するためにビデオをアーカイブまたは配布する場合は、ProResやDNxHDなどの中間コーデックを選択してください。