Logo wizaman's blog (legacy)

ゲーム動画のエンコード事情を整理

November 5, 2017
23 min read
Table of Contents

私のブログで閲覧数の多い記事の中には、下記の動画エンコード関連のものがあります。

書いてから随分時間が経ってますが、なんやかんや有用らしい。

ただ、流石にちょっと古いので、周辺情報を整理してみます。私も暫くゲームのキャプチャとかやってなかったんで、改めて調べ直してみました。が、なんか思ったより沼にハマった気がします。色空間まわりはかなり自信がないので、詳しい人からツッコミあると嬉しいな。

キャプボは使える前提で話を進めます。エンコードなどの基本的な概念については、「高画質動画エンコード設定」で簡単に説明しています。

やりたいこと

高画質(低劣化)を維持しながら高い圧縮率(ファイルサイズ削減)の動画を出力するには、かなりの処理時間を要します。

つまり、

  • 録画目的では、リアルタイムに圧縮処理を間に合わせるため、動画ファイルサイズの肥大化を妥協する必要がある
  • 配信目的では、一度に送信できるデータ量が大きくないので、画質の劣化や低解像度を妥協する必要がある

このように、目的によって手段が変わります。今回話したいことは録画目的の方です。できるだけきれいな動画を残したい。

録画に利用するソフトは**「アマレコTV」**が使いやすく有名です。私も使ってます。

今回、特に触れませんが、配信に利用するソフトは現在**「OBS Studio」**が定番でしょう。

要点

話が長いので、先に要点をまとめます。

  • 録画時は可逆圧縮で保存し、あとで非可逆圧縮によりファイルサイズを削減する。
  • キャプボからの録画にはアマレコTVが便利。
  • アマレコTVで録画するにはコーデックにAMV4を使うのが普通だが、Ut Video Codec Suitoという選択もある。
  • AMV4で録画すると、AviUtl+x264guiExぐらいしか安定したエンコード環境がなくてしんどい。
  • Ut Video Codec Suiteで録画すれば、エンコードに使うソフトの選択肢が増える。HandBrakeとか良い。
  • 非可逆圧縮はH.264/AACフォーマットのMP4にする。

今の私が出した結論はだいたいこんな感じ。話題が多いですが、これから説明していきます。

H.264での一括エンコード方法は別の記事にまとめています。

録画は可逆圧縮

録画にはリアルタイム処理が求められるため、その時点で高画質かつ高圧縮なエンコードをしている余裕がありません。高品質なエンコードは再生時間よりも長い処理時間を要します。

そこで、高速な可逆圧縮コーデックを使用して録画します。画質劣化はありませんが、録画後のファイルサイズがとんでもなく大きくなる(未圧縮よりは遥かにマシ)ので、あとで長い処理時間をかけて非可逆圧縮することで、高画質を維持しながらファイルサイズを落とします。

録画に使用する可逆圧縮コーデックとしては**「AMV4ビデオコーデック」「Ut Video Codec Suite」**が有名です。これらは可逆圧縮としては、そこそこの圧縮率でありながら、高速に動作しますのでリアルタイムで扱うのに向いています。つまり、録画向き。

アマレコTVの動作にAMV4は必須とされていますが、録画では他のコーデックを指定することは出来ます。動画はAVIファイルになります。

余談ですが、可逆圧縮は動画の編集素材を保存するのにも便利です。編集して出力した動画をさらに編集する、といった複雑な編集作業をしたい場合のことですね。画質劣化を伴う非可逆圧縮は最終工程だけにするのが理想です。

AMV4ビデオコーデック

アマレコTVで録画する場合、コーデックにAMV4を採用するのが一番手間がないです。

但し、下記のことに留意が必要です。

  • AMV4は有料のコーデックであり、ライセンスを購入しないと動画内にAMV4のロゴが入る。
    • アマレコTV4(現行バージョン)では、AMV4を購入しないと他のコーデックにしてもロゴが入るという情報アリ(私は購入済みなので確認してない)。
  • AMV4は実質的にアマレコTV専用コーデックであり、利用できるソフトが限られる。

動画変換・編集ツールとして有名なAviUtlが、ちょうどAMV4で保存したAVIファイルを扱えるため、お世話になっている人が多いと思います。ただ、他のソフトでAMV4動画を扱おうとするとなかなか厳しいのが実際です。

Ut Video Codec Suite

Ut Video Codec Suite(以下、Ut Videoと呼ぶ)はきちんとした公式サイトがないので、入手先は作者のブログから探すことになります。

readmeによると、

Ut Video Codec Suite は、複数のプラットフォームとインターフェースをサポートするロスレス映像コーデックです。インターフェースは VCM、DMO、QuickTime をサポートします。内部保持形式は RGB、RGBA、YUV422、YUV420 をサポートします。

とのことです。

また、動画変換ツールといえばコマンドラインから使えるffmpegが有名ですが、Ut Videoの互換実装がffmpeg(libavcodec)に採用されたため、ffmpegを利用している動画変換ツールなどでUt Video動画を扱える、というメリットもあります。そういうわけで、AMV4よりは遥かに利用可能なケースが多いです。

但し、ffmpegによる互換実装は本家の実装ではないので、最新版の仕様や性能を必ずしも反映しないですし、互換実装特有のバグを含む可能性もあるようです。

Ut VideoをアマレコTVの録画で使用するには設定が必要です。

  1. スタートメニューから「Ut Video Codec Suite」→「Global Configuration」を選択すると、Ut Videoのグローバル設定が開くので、「コーデック側で設定をグローバルに保持する」にチェックを入れる。
  2. アマレコTVの「設定」→「録画設定」の「ビデオ圧縮」パネルにて「更新」ボタンを押すと、コーデック一覧が表示される。
  3. コーデック一覧から使用したいUt Videoコーデックを選択する(キャプボの録画にはULY2かULH2推奨)。
  4. 必要であれば「設定」を押してUt Videoコーデックの設定を変更する。
  5. (任意)アマレコTVの「設定」→「高度な設定1」の「ビデオレンダラー」パネルにて「HDYCをUYVYに偽装する」のチェックを外す。

Ut Videoは内部保持形式の種類によって、異なるFourCC(4文字の識別子)を割り当てていて、それぞれが別のコーデックのように一覧に出てきます。それらがどういう対応になっているのかは、Ut Videoのreadmeに記載があります。ここの選択がややこしいです。

アマレコTVでのキャプボの録画には、ULY2かULH2推奨です。キャプボからの入力解像度がHD解像度(720p以上)ならULH2、SD解像度ならULY2にするのが良いと思います。

「HDYCをUYVYに偽装する」オプションは無効にした方が正確な色が出るとのことですが、私の環境ではいまいち違いを実感できず。

上記設定の理由をざっくり説明しますが、簡単な話ではないので、興味なければ「フレーム内予測方式」まで読み飛ばしてください。

RGBとYUV

色の表現方法としてRGBと**YUV(YCbCr)**があります。RGBは光の三原色なので理解しやすいでしょう。YUVは輝度と色差で色を表します。RGBとYUVの変換式はありますが、限られたビット数に丸めるとかの都合で誤差が出るので、この変換はできるだけ少なくした方が正確な色を維持できます。

RGBやYUVをビット列で表現することでコンピュータ上で扱えるようになるわけですが、各パラメータをどのぐらいの精度(ビット数)で記録するか、どの順番で配置するか、という形式にも種類があります。例えば、RGB24(RGB888、フルカラー)とRGB16(RGB565、16bitカラー)では、表現方法は同じRGBですが、表現可能な色数は全く異なります。同様に、YUVにもYUV420やらYUV422といったフォーマットがあります。YUVの命名規則は複雑なので単純にビット数を表すとは限りません。

また、YUVは通常リミテッドレンジの都合により、RGBより表現可能な色の範囲が小さいです。詳しくは下記サイト参照。

動画はYUVフォーマットに対して圧縮するのが主流です。しかし、動画編集目的であればRGBの方が扱いやすいため、RGB入力にしか対応していない動画編集ソフトがあります。AMV4はYUV入力に対して必ずYUVで出力する(RGB出力を強制するオプションがない)ので、別のソフトでYUV→RGB変換をしないと編集できないケースなど、噛み合わせが悪いことがあるようです。

色空間

さて、RGBとYUVの変換式で、係数をどのように取るかによって、YUVが表現する色空間が異なります。この係数(colormatrix)を規格化したものとして、**「BT.601」「BT.709」**があります。BT.601はSD解像度向け、BT.709はHD解像度向けという説明がされることが多いと思います。私も詳しくは理解してません。大事なことは、誤ったcolormatrixを適用すると本来の色を表現できない、ということです。個人的にはそんなに差がないように感じてますが、動画編集などで誤差が積み重なると許容できない変化になることは想像できます。

ところで、アマレコTVでスクリーンショットを撮ると、入力画像がYUVであればRGBに変換されるわけですが、このとき計算される色空間がどうやらBT.601固定らしいです。BT.709の入力映像からスクリーンショットを撮ると、BT.601で変換されてしまうために色味が変化するとか。

FourCCによる違い

色々と書きましたが、色の表現方法にも様々あり、Ut Videoでは個別にFourCCを割り当てる方針です。本当の意味で可逆圧縮するためには、内部保持形式(色フォーマットや色空間)の変換による誤差を排除、つまり、内部保持形式を統一する必要があります。利用者側が内部保持形式をちゃんと考えてねって思想で作られています。いやー、難しいですね。

で、やっとアマレコTVなんですが、キャプボ入力設定を確認してください。多分、色のフォーマットがYUY2(YUV422)になっています。例えば、私の使っているキャプボ「MonsterX 3.0R」では、入力設定が「*w=1920, h=1080, fps=60.00, fcc=YUY2, bit=16」のようになり、fccパラメータとしてYUY2が指定されていることがわかります。

Ut VideoでYUY2として利用可能なのは、**ULY2(YUV422 BT.601)とULH2(YUV422 BT.709)**になります。他を選ぶと録画時にエラーが出ます。あとは色空間の問題なので、キャプボの入力解像度で判断しましょう、ということになります。

デスクトップキャプチャなんかはRGBとなりますので、そのときはULRG(RGB)かULRA(RGBA)を選ぶのが良いでしょう。

フレーム内予測方式

コーデックの設定に関しては、基本的に触る必要はないと思いますが、「フレーム内予測方式」はちょっと考えてみましょうか。

「フレーム内予測方式」は「Predict Gradient」が全体性能的に良いらしいのですが、アマレコTVで試してみたら映像が真っ暗になってしまいました。ffmpegとか私の環境依存かもしれませんが、本家の新機能が使えない、ということなら仕方ないかなと。

残りは「Predict Left」と「Predict Median」の2択ですが、readmeによると両者ともエンコード速度はほぼ同じだそうです。ファイルサイズを犠牲にデコード速度を上げたのが「Predict Left」ですが、録画目的でファイルサイズとデコード速度どっちが大事かと言うと、ファイルサイズです。だから、録画だけが目的なら「Predict Median」が良いと思います。あとで動画編集する予定があって、そのときの再生負荷が気になるようであれば、「Predict Left」にする意味があるでしょう。

ファイルサイズを減らすと、もちろんストレージ容量の節約になって、保存可能な本数が増えます。しかも、ストレージへの書き込み速度の限界にぶち当たってリアルタイム保存が間に合わなくなるというリスクを低減することにもなります。

以前、私が720pの動画を撮っていたときはHDDでもほぼ問題なかったのですが、1080pの動画を撮るようになったときは、頻繁に書き込みが間に合わなくなりました(アマレコTVが固まるので結構面倒)。HDDは構造上、ランダムアクセスが苦手なので録画に向いていません。なので、録画用SSDを用意するのはおすすめです。私はSSDを増設しました。

性能比較

Ut Video作者が主要な可逆圧縮コーデックの性能比較を公開しているのも興味深いです。

Ut Videoは圧縮率の面で優れています。

処理速度はスレッド数やCPUの世代によってスコアが変わってきます。AVX2対応CPU(IntelではHaswell世代以降)だと、Ut Videoは速度面では不利っぽいです。他がさらに速くなったというだけなので、十分なのですが。それにしても、AMV4ってシングルスレッドでこの速度出すのか・・・。

比較対象に挙がっているMagicYUVがかなりバケモノな気がしますが、日本語情報がほぼなくて、現行バージョンは有料なのでちょっと手を出しにくい感じ。エンコード検証に時間かけたいわけではないので試してません。

非可逆圧縮でファイルサイズ削減

可逆圧縮で録画した動画ファイルはめちゃくちゃ重いので、多少画質を落とすことにはなりますが、非可逆圧縮して手頃なサイズにします。

非可逆圧縮のフォーマットとしては、H.264が広く普及していて、何かと扱いやすいです。他にもH.265などありますが、圧縮規格は特許まわりでゴタゴタが多いので、下手に新しいものに手を出さないほうがいい気がします。

H.264はあくまでも映像の圧縮フォーマットです。ここに音声やメタ情報を加えて、1つの動画ファイルとして扱うためのフォーマットがあります。MP4もそのひとつです。あくまでコンテナ(入れ物)なので、中身の圧縮フォーマットは様々です。音声に関してはAACが一般的ですね。

さて、エンコードに使うソフトですが、ニコニコ動画に投稿したいときは、AviUtlを使うのが良いでしょう。ニコニコ独自の制限に対応するための設定など、インターネット上での情報が豊富です。ただ、そういった理由がなければ、エンコード目的でAviUtlを使うメリットはあまりないと思っています。

私は大量の動画を撮って、それをただ保存するためだけに一括エンコードしたいと考えています。その場合には、AviUtlは使いにくいため、他のソフトを利用したほうが楽です。現在、人気があるのはHandBrake、XMedia Recodeあたりかな。これらのソフトなら一括変換もできます。

で、AMV4の話でも書きましたが、AMV4で出力した動画を扱えるソフトはあまりありません。これが面倒なので、Ut Videoに乗り換えたわけです。あとは好きなようにすればいいですが、一括変換の方法はざっくり別の記事にまとめてみました。

参考