Logo wizaman's blog (legacy)

高画質動画エンコード設定

February 7, 2015
18 min read
Table of Contents

(2017/11/05追記)事情が古くなってきたので、「ゲーム動画のエンコード事情を整理」も参照してください。

AviUtlのx264guiExプラグインを利用したエンコード設定のメモ。この設定は私が普段使っているものです。身内向けの簡易まとめなので、詳しく解説しません。

私の利用ケースを一応説明します。HD解像度のキャプチャーボードに入力された映像をアマレコTVで録画しているのですが、とりあえずは画質を落とさないためにAMV4ビデオコーデックの可逆圧縮で録画して.aviファイルとして保存します。AMV4は録画に適したコーデックです。ライセンス購入すれば動画にAMVのロゴが差し込まれなくなります。録画ではリアルタイム性が求められるので、ここで一気にファイルサイズを落とすのは難しいです。動画をたくさん撮っているとすぐHDDを圧迫するので、さらにx264コーデックでエンコードして、よりファイルサイズの小さい.mp4ファイルにします。

この処理には長い時間を要しますが、驚くほどファイルサイズを小さくすることができます。また、CPU負荷が高いため、夏場など熱に気をつけてください。

基礎知識

確認のため、基本的なことを少し説明します。

圧縮とはデータサイズを小さくすることです。データの変換をエンコードと言いまして、圧縮もエンコードの一種です。そして、圧縮されたファイルを実際に利用するときは逆変換(デコード)をしなければいけません。デコードによって元のファイルと全く同じものを再現できるような圧縮方式を可逆圧縮といい、ある程度似たものを再現する方式は非可逆圧縮と呼ばれます。画像で言うなら、.pngが可逆圧縮であり、.jpgが非可逆圧縮であるので理解しやすいでしょう。非可逆圧縮では、完全な再現を諦めることで劇的にファイルサイズを小さくすることができます(圧縮率が高い)。

動画ファイルはあまりに重いので基本的に非可逆圧縮します。画質が落ちることになりますから、高画質を維持できるような現実的な設定を考えねばなりません。それが今回の話のメインですね。

高画質を維持するためには、ビットレートと圧縮方法が大事です。ビットレートは、1秒あたりのデータサイズをビット数で示します(単位bps)。データサイズが大きいほうが持っている情報が多いので、再現性が高まるわけです。そして、同じデータサイズにどれだけの情報を詰め込めるかが圧縮の仕事ですから、やはりどのように圧縮するかも大事なわけです。また、リアルタイムにデコード処理が間に合わなければ、満足に動画を再生することができませんから、再生負荷とのバランスも大事です。過剰に圧縮する設定にすると、負荷が高すぎて快適に再生できる環境が限られてしまいます。

ただ、動画の圧縮って設定項目が多すぎてよくわかんないんですよね。どの設定がどのように影響するか、簡単にまとめてくれている人がいるので、そういうのを参考にして、自分に合う設定を考えていきます。そういうわけなので、細かいことを私に聞かれても困ります。

準備

AviUtl本体とx264guiExプラグインの入手先は以下。

導入方法は以下を参考に。私からは特に使い方は説明しません。

x264guiExは、あくまでインターフェースであって、外部プログラムが別に必要となるのですが、いつからか必要なファイルを自動でダウンロードして導入してくれるようになりました。x264guiExのバージョンアップも、最新バージョンのセットアッププログラムで上書きしてくれるようになったので、自分で置き換える必要がなくなりました。神ツール。

最近のバージョンでは、エンコードの中間生成物である.statsファイルと.stats.mbtreeファイルも消してくれるみたいです。

x264guiExの設定

上の記事を参考にしました。一通り設定したらx264guiExのプロファイルに保存しておきましょう。

以下、私の設定画面のスクリーンショットを貼り付けます。

「x264」タブ
SnapCrab_2015-02-08_04-06-04_No-0000

「レート・QP制御」タブ
SnapCrab_2015-02-08_04-06-13_No-0000

「フレーム」タブ
SnapCrab_2015-02-08_04-06-17_No-0000

「拡張」タブ(※無変更)
SnapCrab_2015-02-08_04-06-21_No-0000

出力動画は720p/60fps想定です。

動画ビットレートの2500kbpsはなんとなく入れた値でしたが、個人的にはこれで十分かなと思ってます。あんまり上げすぎても動画ファイルがでかくなってしまいますし。

補足ですが、一度の処理で一気にエンコードすることをシングルパス(1pass)といいます。一方、マルチパス(2pass)は、一度動画全体を解析して解析データを得てから、実際のエンコード処理をするものです。当然、マルチパスの方が処理時間は長くなりますが、圧縮効率はいいわけです。

それと、「x264」タブで、「色空間」の「colormatrix」という項目がありますが、HD解像度(720p以上)ならば「bt709」にします。そして、AviUtl側でも「設定」→「色変換の設定」で出力を「BT.709」にしてください。「colormatrix」をSD解像度向けの「smpte170m」にするならば、「色変換の設定」は出力を「BT.601」にします。AviUtlがコーデックに出力する形式と、コーデックが受け取る形式を一致させるように設定するということです。

エンコードの自動化

残念ながら、**AviUtlには特定フォルダにある動画をすべて自動でエンコードするような機能がありません。**一度、エンコード設定を決めたらあとは勝手にやってほしいのですが、1個ずつファイルを開いて処理しなければいけません。バッチ機能はありますが、バッチ登録はやはり手動なのです。

それでは非常に面倒なので、外部プログラムからAviUtlを強引に操作して自動化します。「AviUtl Control」という小規模なプログラムで操作できるので、これを利用した自動化スクリプトの改良版を自作して利用しています。このスクリプトは過去にブログで公開しています。

いつも寝る前に実行してます。

YouTube

今回の設定は、YouTube投稿用動画のエンコードにもそのまま使用しています。ただ、YouTubeに投稿すると必ずサーバで再びエンコードされてしまうため、手元の動画よりも多少画質が落ちることになります。特にSD解像度だと低いビットレートを割り当てられるため、HD解像度で投稿するのが基本です。

ちなみに、私がYouTubeに投稿した動画のうち、エクストルーパーズのEX2動画は、映像の一部が崩壊しているのですが、あれは手元の動画も崩壊してますから、サーバサイドエンコードは関係ありません。参照距離を高く設定しすぎたために崩壊して、よく確認しないまま元の動画を消してしまったので、仕方なく崩壊した動画を投稿してます。確認マジ大事。

ニコニコ動画

ニコニコ動画は、ニコニコの仕様に合わせた動画を投稿すればサーバサイドエンコードを回避できます。この仕様は動画投稿者が一般会員かプレミアム会員かによって異なります。

従って、ニコニコ動画用にエンコードする時は、仕様に合わせて上限ビットレートや上限ファイルサイズを設定します。解像度も合わせないといけませんが、これは「Lanczos 3-lobed 拡大縮小」プラグインなどで対応します。Wiki見ればいいので、詳しい手順は説明しません。

現時点でのサーバサイドエンコードを回避できる仕様を以下にまとめます。動画投稿者はプレミアム会員になるべきだと思います。プレミアム会員にしても上限ファイルサイズは存在するので、長い動画は分割すべきですね。めんどくせぇ。

項目仕様
コンテナMP4
映像コーデックMPEG-4 AVC/H.264
解像度プレミアム:無制限
一般:720p以内
フレームレート0.33~120fps
音声コーデックMP3、PCM、AAC
サンプリングレートMP3、PCM:22kHz、44.1kHz
AAC:48kHz以下
ファイルサイズプレミアム:100MB
一般:40MB
ビットレート(映像+音声)プレミアム:無制限
一般:656kbps(公式には600kbps)以下

x264guiExでは、次のような対応をしておけばいいってことです。

  • 「x264」タブで「上限ファイルサイズ(映像+音声, MB)」にチェックが入っていて、上記の仕様を満たす値が入力されているか確認。プレミアム会員なら100、一般会員なら40を入れる。
  • 一般会員に限り、「上限ファイルビットレート(映像+音声, kbps)」を656にしておく。

Blu-ray

x264guiExにはBlu-ray用プロファイルが既に用意されてます。私はパソコン上の動画をBlu-rayに記録したことがないので、Blu-rayの仕様とか調べてもないけど、覚書として。

x264guiExの設定詳細メモ

最後に、今回の設定を決めるために自分用に作ったメモを残しておきます。Wikiに書いてあることをベースにしていて、割とそのまんまな引用が多いですが。

「x264」タブ

  • 「自動マルチパス」推奨。
  • 「上限ファイルサイズ」と「上限ファイルビットレート」を確認。

「色空間」の「colormatrix」については、ニコニコ動画まとめWikiによると、

SD解像度(縦解像度が720未満)の場合はBT.601(SMPTE170m もしくは BT.470bg)、HD解像度(縦が720以上)の場合はBT.709と呼ばれる行列を使用することと国際規格で決められている。

「レート・QP制御」タブ

項目説明
AQ(適応的QP)「VAQ」か「AutoVAQ」で画質向上。後者を選択して1.0~1.3にするとメリハリのある画質になることも。
Psy-Rd(視覚心理最適化)「RDO」は0~1.0にする。実写など複雑な映像は高めがいいらしいが、それ以外は0.2~0.5など低めに。「trellis」は0のまま。
mbtree レート制御オン推奨。
レート制御先行探査フレーム数基本的に40のまま。数値を大きくすると画質が向上するが、最高でも60までにしておく。

「フレーム」タブ

項目説明
動き予測アルゴリズム「Hexagonal Search」か「Uneven Multi-Hexagon」を選択。後者の方が高画質だが、エンコードが遅い。
サブピクセル動き予測数値を上げると画質向上するがエンコードが遅くなる。7~9ぐらい推奨。
動き探索範囲16か32にする。後者のほうが高画質だがエンコードが遅い。
動き予測方式「auto」推奨。
参照距離数値を上げると画質向上するがエンコードが遅くなるし再生負荷も高い。上げ過ぎると再生時に映像が崩壊する。3~6推奨。
最大連続Bフレーム数数値を上げると圧縮率向上するがエンコードが遅くなるし再生負荷も高い。3~6推奨。
適応的Bフレーム挿入「完全」推奨。
ピラミッド参照「normal」推奨。
重み付きBフレームオン推奨。
重み付きPフレームオン推奨。基本的に「Smart」のままでいいが、問題があれば「Simple」も試す。
マクロブロックチェックが多いほど高画質。再生負荷が気になるときは「p4x4」のチェックを外す。
キーフレーム間隔の上限10秒間隔のシーク移動でよいなら300、1秒間隔のシーク移動なら30(30fpsの場合)。「-1」で自動設定。
インループ デブロックフィルタオン推奨。-1で画像がシャープに。
CABACオン推奨。
DCT係数間引きオン推奨。
スキップMB検出オン推奨。
レート歪み最適化「Final MB encode」または「All」を選択することで画質向上。

「拡張」タブ

何も変更しない。

「音声」パネル

基本的には「AAC-LC ビットレート指定」にして適当なビットレートにしておく。