このページの全ては誤っているかもしれません。x264関連の記事に関してを読んでください。
x264(vbv-maxrate,vbv-bufsize,profile,level),H.264(Profile/Level)
H.264のプロファイルとレベルのまとめ。他のサイトにも同じような表はあるが、聞かれる度に答えるのも面倒なので。
なお、Blu-ray等のH.264関連規格では、H.264で指定されているものとは別にプロファイル・レベルに相当する内容が規定されていることがある。それらはここでは扱わない。Blu-rayでの制限に関しては、メモレベルの記事ではあるが、x264とBlu-rayを参照のこと。
また、vbv-bufsize/vbv-maxrateに指定する値ではなく、その正体(中身)を知りたい方はx264(nal-hrd),H.264/AVC(HRD),MPEG-1/2(VBV)やCBRの幻想を参照してほしい。
前置き
H.264は、モバイルからHDまで様々な用途に対応する映像圧縮の規格だ。しかし、同じH.264対応だからと言って、大きなTVから携帯電話やiPodまでもが同じ動画ファイルを再生できるわけでは、当然ない。
このため、機器の処理能力に合わせて、再生互換性に関するある程度の範囲を定めたのがプロファイルとレベルである。プロファイルは主に圧縮率に関連する機能の範囲であり、レベルは主に解像度やフレームレートに関連する量的な範囲である。
多くの機器では、例えマニュアルに記載がなくとも、このプロファイルとレベルが合わなければ問答無用で再生不能と判断されてしまう。画質云々以前の問題だ。なお、プロファイルとレベルは、多くの機器で「必要条件」ではあるが「十分条件」ではない。つまり、対応のプロファイル・レベルを正しく使用しても、必ず再生できるとは限らない。
x264では当然これらの指定が可能であるが、その指定方法には多少のノウハウが必要であるため、この記事にまとめた。レベルと非常に関連の深い(むしろレベルの一部と言うべきである)--vbv-maxrate/--vbv-bufsizeに指定する値も併せて掲載している。
プロファイル
x264ではプロファイルは使用する「機能(オプション)」によって自動的に決定される。プロファイルは--profileで強制することが可能で、この場合、指定したプロファイルで無効な機能は、強制的にOFFにされる。
プロファイルは圧縮率に大きく影響するため、できれば再生機器が許す限り、常に高機能なHigh Profileを使いたいところだが、例えばPSPはMain Profileまでしか再生出来ない。
なお、規格上のプロファイルは多数存在するが、ここではx264r1542現在で--profileに指定できるものに限る。
Profile | B-frame | interlace | CABAC | Weighted Prediction |
8x8dct | CQM |
---|---|---|---|---|---|---|
Baseline | no | no | no | no | no | no |
Main | yes | yes | yes | yes | no | no |
High | yes | yes | yes | yes | yes | yes |
各機能に関して簡単に説明しておこう。
- B-frame
- noであるBaselineでは-bまたは--bframesを0で指定する必要がある。これに伴い、Bフレーム関連の機能、つまり--b-adapt, --b-bias, --b-pyramid, --weightb, --pbratioや--partitionsのb8x8等の機能は意味を持たなくなる。
- interlace
- --interlace, --tff, --bff等で指定するインターレースモードの事で、noであるBaselineでは使用できない。x264で使用可能なMBAFFに限った話ではなく、他のエンコーダで使用可能なPAFFも許可されないので注意。
- CABAC
- noであるBaselineでは--no-cabacを指定する必要がある。これによって--trellisもOFFになる。なお、x264ではロスレスの場合には--no-cabacに伴い8x8dctもOFF(--no-8x8dct)になる。が、そもそもロスレスは他に色々な制限を含んでおり、かつx264のロスレスはr994以降、High 4:4:4 Predictive Profileなのでここでは扱わない。
- Weighted Prediction
- noであるBaselineでは、--weightp 0を指定する必要がある。weightbも使用できないが、そもそもBフレームが使用できないため--no-weightbは指定しなくともよい(強制でOFFになる)。なおx264ではr1542現在、未実装であるために、weightpとインターレースは併用出来ない。両方指定している場合はインターレースが優先される。
- 8x8dct
- noであるBaseline/Mainでは--no-8x8dctを指定する必要がある。これに伴い、--partitionsのi8x8は意味を持たなくなる。
- CQM
- noであるBaseline/Mainでは、--cqm, --cqmfile, --cqm4, --cqm8等のカスタムマトリックスが意味を持たず、--cqm flatである必要があることを意味する。デフォルトで--cqmはflatなので特段指定の必要はない。
中でもB-frame, interlace, CABACは非常に大きな要素で、これらの選択次第で映像の見た目、または出力サイズに大きく影響する。正直、Baseline ProfileではH.264のメリットは激減する。つまり、可能な限りMain Profileは使用したい。
レベル
x264ではレベルは解像度等から自動的に決定される。ストリームに埋め込まれるレベルの情報は--levelで強制することができる。上記の--profileと異なり、このオプションはストリーム中に埋め込まれるレベルのフラグを指定するのみで、指定のレベルに併せて他のオプションを変更したりはしない(例外あり)。
例えば、--levelの自動・手動設定の別に関わらず、最大ビットレート(MaxBR:--vbv-maxrate)とバッファサイズ(MaxCPB:--vbv-bufsize)は自分で指定する必要がある。
レベルはプロファイルに比べれば選択の幅がある再生機器が多いが、x264ではプロファイルと違い、レベルと関連のある機能(オプション)を強制できない。このため、プロファイルよりも注意して見なければ再生互換性に支障を来す可能性が大きい。また、レベルはむやみに高くしても、画質が良くなるとは限らない。単に再生可能な機器の幅を狭めるだけの結果になることもある。よって、変換元の動画ファイルの条件に従い、解像度・フレームレートの例の範囲にちょうど収まる程度のレベルを選択するのが適切だ。
MaxBR(vbv-maxrate)/MaxCPB(vbv-bufsize)は基本的にはレベルで決まるのだが、プロファイルにも影響を受けて最大値が異なる。High ProfileのMaxBR/MaxCPBはBaseline/Main Profileの25%増しで計算出来るが、ここでは利便性のために全てを一覧にする。
なお、バッファにはここで一覧にしているCPBの他、もう一つDPBというバッファが存在する。DPBそのものの値は一般的には知る必要がないが、それに依存する参照できるフレーム数(--ref)の最大値は重要であるため、解像度の例と合わせて表記している。DPBはプロファイルで変化しないため、--refの最大値も変化しない。
一覧
数値は最大値であり、それ以下であれば問題ない。
Level --level |
MaxBR --vbv-maxrate (kbits/s) Baseline/Main |
MaxCPB --vbv-bufsize (kbits) Baseline/Main |
MaxBR --vbv-maxrate (kbits/s) High |
MaxCPB --vbv-bufsize (kbits) High |
interlace --interlace/ --tff/--bff |
解像度・ fpsの例 (--refの最大値) |
---|---|---|---|---|---|---|
1 | 64 | 175 | 80 | 218※ | no | 128x96@30.9(8) 176x144@15.0(4) |
1b | 128 | 350 | 160 | 437※ | no | 128x96@30.9(8) 176x144@15.0(4) |
1.1 | 192 | 500 | 240 | 625 | no | 176x144@30.3(9) 320x240@10.0(3) 352x288@7.5(2) |
1.2 | 384 | 1000 | 480 | 1250 | no | 320x240@20.0(7) 352x288@15.2(6) |
1.3 | 768 | 2000 | 960 | 2500 | no | 320x240@36.0(7) 352x288@30.0(6) |
2 | 2000 | 2000 | 2500 | 2500 | no | 320x240@36.0(7) 352x288@30.0(6) |
2.1 | 4000 | 4000 | 5000 | 5000 | yes | 352x480@30.0(7) 352x576@25.0(6) |
2.2 | 4000 | 4000 | 5000 | 5000 | yes | 352x480@30.7(10) 352x576@25.6(7) 720x480@15.0(6) 720x576@12.5(5) |
3 | 10000 | 10000 | 12500 | 12500 | yes | 352x480@61.4(12) 352x576@51.1(10) 720x480@30.0(6) 720x576@25.0(5) |
3.1 | 14000 | 14000 | 17500 | 17500 | yes | 720x480@80.0(13) 720x576@66.7(11) 1280x720@30.0(5) |
3.2 | 20000 | 20000 | 25000 | 25000 | yes | 1280x720@60.0(5) 1280x1024@42.2(4) |
4 | 20000 | 25000 | 25000 | 31250 | yes | 1280x720@68.3(9) 1920x1080@30.1(4) 2048x1024@30.0(4) |
4.1 | 50000 | 62500 | 62500 | 78125 | yes | 1280x720@68.3(9) 1920x1080@30.1(4) 2048x1024@30.0(4) |
4.2 | 50000 | 62500 | 62500 | 78125 | no | 1920x1080@64.0(4) 2048x1080@60.0(4) |
5 | 135000 | 135000 | 168750 | 168750 | no | 1920x1080@72.3(13) 2048x1024@72.0(13) 2048x1080@67.8(12) 2560x1920@30.7(5) 3680x1536@26.7(5) |
5.1 | 240000 | 240000 | 300000 | 300000 | no | 1920x1080@120.5(16) 4096x2048@30.0(5) 4096x2304@26.7(5) |
※本来はそれぞれ218.75と437.5だがx264は整数しか受け取らないので切り捨て表記とした。
インターレースを使用できるのはLevel2.1〜4.1のみで、それ以外では使用できない(frame_mbs_only_flag=1)。
注意事項
上記では規格の中から抜粋して掲載している。実際の規格ではもっと様々な規定が行われているが、一般にはあまり気にされていない。
例えばレベルには1秒間に処理できるマクロブロック数が規定されており、これに従ってフレームのサイズやDPBのサイズが規定されている。また、x264がr1456で対応した、一部のBlu-ray規格の検証機で検査されるMinCR(Min compression ratio)や、x264でp4x4を使用しない方がよい理由で少し触れているMaxMvsPer2Mbも規定されている。
他に、以下のような注意事項がある。
- --refの最大値はレベルで一律決まるのではなく、解像度とレベルの組み合わせで異なる。
- 上記の表に記載された解像度の例の範囲で使うことを推奨する。
- 上記のMaxMvsPer2Mbの問題に絡み、Level3以上ではp4x4を使用すると規格に違反する可能性が高い。
- 今後x264の--partitionsにb4x4(つまりbsub8x8)が実装された場合、これにも同様の制限が発生すると思われる。
- また、b4x4(bsub8x8)は"A.3.3 Profile-specific level limits"のe)に規定するように、MinLumaBiPredSizeにより、Baseline Profile以外かつLevel3.1以上の場合は使用できない。
- 今後x264の--partitionsにb4x4(つまりbsub8x8)が実装された場合、これにも同様の制限が発生すると思われる。
- x264cliのr1452現在、--refを明示的に指定しなかった場合に限り、レベルに合わせてデフォルトの--ref=3に対する自動的な調整が行われる。
- 上記の表のMaxBR/MaxCPBはVCL-HRDのものであり、NAL-HRDでは本来20%増しとなる。
- r1260でVBVをNALレベルで行うようになったx264ではそちらの値でもいいのかもしれない。
- ただし、同時にVCL-HRDを守れているのかは猫研では確認出来ていない。
- 規格書の"C.3 Bitstream conformance"のNOTE 1の解説は気になるが…。
- 個人的には安全の為に上記のVCL-HRDの値を使用すること推奨する。
- H.264の規格書では"A.3.1 Level limits common to the Baseline, Constrained Baseline, Main, and Extended profiles"のj)を見よ。
- High Profileの25%増しの根拠については規格書の"A.3.3 Profile-specific level limits"のg)とh)、そして"Table A-2 Specification of cpbBrVclFactor and cpbBrNalFactor"を見よ。
- ここで言う規格書は、200503(Version 3)以降のものを参照すること。
おまけ:DPBと--refの最大値の計算
DPBに関してはユーザ側で定義することは何もなく、間接的に--refが影響されるだけなのだが、おまけとして少々触れておく。
DPB(Decoded Picture Buffer)は、デコードされた生のピクセルデータ、つまりYUV4:2:0等のそのまま表示可能なデータが置かれるバッファだ。これらは被参照フレームとなるためにDPBに置かれる。H.264では複数参照フレームが許されているため、DPBはMPEG-2などに比べて大きい。このDPBに置けるフレームの枚数が、すなわち--refの最大値となる。
200903版(Version 11)のH.264の規格書ではMaxDPBはマクロブロックの個数(MBs)を単位として以下のように規定されている(200711版:Version 8までは規定の仕方が異なるので注意)。
Level | 1 | 1b | 1.1 | 1.2 | 1.3 | 2 | 2.1 | 2.2 | 3 | 3.1 | 3.2 | 4 | 4.1 | 4.2 | 5 | 5.1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MaxDpbMbs | 396 | 396 | 900 | 2376 | 2376 | 2376 | 4752 | 8100 | 8100 | 18000 | 20480 | 32768 | 32768 | 34816 | 110400 | 184320 |
単位がMBsであるため、フレームの枚数もMBs基準で計算する必要がある。ここでは1920x1080をLevel4でエンコードする場合を例に計算してみよう。マクロブロックは16x16ピクセルであること、小数点以下は切り上げになることに注意して欲しい。
マクロブロック単位の幅 = 1920 / 16 = 120 マクロブロック単位の高さ = 1080 / 16 = 67.5 → 68 1フレームに含まれるマクロブロック数 = 120 * 68 = 8160
この値で上記のMaxDpbMbsを割れば、--refの最大値が求まる。今度は小数点以下が切り捨てになるので注意。
--refの最大値 = 32768 / 8160 = 4.0156... → 4
この前掲の表と照らし合わせて見てもらえば、Level4での--refの最大値はこの計算で求まった4になっていることが確認できる。なお、MaxDPBによる制約とは別に、--refの最大値は16であるため、この計算で16を超えてもそれ以上は使用できない。
この式は、"A.3.1 Level limits common to the Baseline, Constrained Baseline, Main, and Extended profiles"のh)と"A.3.2 Level limits common to the High, High 10, High 4:2:2, High 4:4:4 Predictive, High 10 Intra, High 4:2:2 Intra, High 4:4:4 Intra, and CAVLC 4:4:4 Intra profiles"のf)に規定されている。
なお、インターレースを使用している場合、マクロブロック単位の高さを求める際には偶数に切り上げがなされる。例えば解像度が1280x720の場合、プログレッシブでは
マクロブロック単位の高さ = 720 / 16 = 45
だが、インターレース使用時には
マクロブロック単位の高さ = 720 / 16 = 45 → 46
としなければならない。"Annex A Profiles And levels"だけを読んでいても気づきにくいが、"7.4.2.1.1 Sequence parameter set data semantics"で以下のように規定されているからだ。
FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits
これによってインターレースエンコードの場合、FrameHeightInMbsは常に偶数になる。
これはMBAFFが高さ方向に2つのマクロブロックを連結してエンコードするため、切りの良い単位が16ではなく32になることに起因する。高さを32で割って端数を切り上げ、その値を2倍すると考えてもいい。
一般的なインターレース素材である480iや1080iではこれによって差異が出ないため問題にならないが、上記のような変わった解像度でインターレースを使用する場合は注意しなければならない。
最終更新時間:2010年04月18日 07時48分44秒