2018/05/15(火)VP9コーデック、WebMコンテナ形式で動画をエンコードする

2018/05/15 25:48 未分類
テスト確認も兼ねて、久々の自分メモ投稿。
何回か紹介しましたが、一昨年の秋から、車載動画 をYoutube にアップしております。但し、一般受けを狙ったものではありません。
5年先くらいから、記録動画としての価値がだんだん出てくると思っています。

動画アップに先立って、動画そのものを制作するわけですが、最後の段階として「エンコード」という作業があります。
筆者の場合、通常、ffmpeg というソフトウェアを使用します。
今回は Youtube で事実上の標準形式となっている VP9 WebM と呼ばれる形式です。
大抵の HTML5 対応Webブラウザではこの形式に対応しているので、試してみる価値はあると勝手に思ってやってみた次第です。

さて、本題ですが、ffmpeg のデフォルト値ではとんでもないエンコードになってしまった、という話です。
元ネタ動画は、拡張子 .avi のファイルですが、このように『エンコードすると、元ネタファイルよりも数倍でかくなってしまう』という状態になるのです:
20180516_2.png


最初は「こんなものか」と思ってはいたが、「10倍近くなるのはさすがに何か設定おかしい・・・」「エンコードにえらく時間かかる・・・」ということで、エンコードパラメータをいじってみます。

結果的には、下記のようにすることで何とかなるかな、というところです。
-c\:a libvorbis -aq 3
-c\:v libvpx-vp9 -crf 28 -b\:v 3000k -minrate 2200k -maxrate 3500k -cpu-used 1 -threads 8
制作しようとしている動画のサイズは、 1280x720p 24fps でこの場合の推奨ビットレートは、1024kbps で間に合うことになっていますが、実際に 1024kbps だと、画質が荒くなってしまって、3000k で目立たなくなるかな、といった感じ。
-crf は画質レベルの指定(値が小さいほど高画質)ですが、推奨値 32 のところを 28 にしています。

これで、こんな感じになりました:
20180516_4.png


エンコードに要する時間もまぁ我慢できるレベルになりました。
20180516_3.png


パラメータ -cpu-used を 0 にすると、エンコード自体にとんでもなく時間かかります。。。

では、何故ファイルサイズがでかくなってしまうのか。これはエンコードビットレートが関係しています:
20180516_1.png
 
20180516_5.png


左が ffmpeg のデフォルト。右はパラメータを上記に設定したときのもの。
ファイルが違っていますが、エンコードの傾向はこんな感じになります。 25Mbps とか、トンデモな値です。
VP9 形式エンコードはCPU負荷もかかる上に、適切なパラメータ設定が必須のようです。