« 文字を3Dモデル化してAviUtl拡張編集に読み込ませる方法(立体テキストの作成) | トップページ | つんでれんこ v2.51のx264設定を、拡張x264(GUI)Ex v1.13用の設定ファイルにしてみた »

2011年10月14日 (金)

ハードウェアアクセラレーション(GPU再生支援)を考慮した場合のx264エンコード設定について

※重要
 知識が浅いため色々と間違ってる可能性があるので
 書いてあることは鵜呑みにせず厳しい目でチェックしてください。

※今更な感じもしますけど、自分がちゃんと理解できておらずエンコードスレで質問中なことをまとめ。
※間違ってる点があればコメントをいただけると、とてもありがたいです。
※調べれば調べるほど、これまでLevelとか全然気にせずエンコしてたのが恥ずかしくなってきました。/(^o^)\
  PS3とかPSPとか携帯端末とか向けにエンコしてる人とか、ちゃんと勉強してエンコしてる人なら
  refとかbframesとかが色々関わってくるのは常識なのだろうけど、
  とにかくニコニコにアップして見れればいいやと適当にエンコしてたからなあ・・・。orz

※2011/10/18更新
  ・一覧表にて、レベル3.2についての記述と計算が抜けていたので追加してその結果を反映。
  ・表に解像度720x480、720x576、1024x576、1024x768、1440x1080を追加。
  ・自分でもテスト用動画をアップしてみたので、その動画一覧のマイリストへのリンクを追記。
  ・その他、記述をいくつか修正。

-----

FlashPlayerは、2010/6/10にリリースされたバージョン10.1から
H.264のハードウェアアクセラレーション(GPU再生支援)をサポートしています。
これを利用すれば、GPUがデコードを行なってくれるので、比較的貧弱なCPUでも
HDサイズのH.264動画をさくさくと快適に再生できるわけですね。

ハードウェアアクセラレーション機能は、FlashPlayerの再生画面を右クリックして「設定...」を選択し、
左下の「ディスプレイ」タブにある「ハードウェアアクセラレーションを有効化」のチェックボックスで
有効・無効を切り替えることができます。
(実際に有効・無効を切り替えるには、動画の再読み込みも必要になります。)

Flashplayerhwconfig

また、ハードウェアアクセラレーションを利用するには、使っているPCのグラフィックカード(チップ)が
H.264の動画再生支援をサポートしていることも条件となります。
まあ最近のPCであれば、多分サポートされていると思います。
(私が使っている5年前のノートPCはIntel945GMチップセットなのでサポートされていませんが・・・orz)

H.264の動画再生支援がサポートされているかどうかは、DXVACheckerというツールで調べることもできます。
AMD系のグラフィックカード(Radeonシリーズとか)なら「デコーダデバイス」の欄に
   ModeH264_VLD_NoFGT_Flash
が出てくればOKで、それ以外なら
   ModeH264_
で始まるのが出てくれば、多分サポートされてます。(自分で試せないのでかなりアバウト。)
ドライバが古いと出てこない可能性もあるので、サポートされているはずなのに出てこないという場合は
ドライバを最新のものにしてみるとよいかもしれません。(ただし自己責任でお願いします。)

さて、このハードウェアアクセラレーションですが、
場合によっては働かなかったり、映像が乱れてしまうことがあるようです。

そのあたりの参考情報が、以下の大百科記事やマイリストにまとめられています。

  動画がおかしくなる方は大百科をクリック→とは- ニコニコ大百科

  FLVENC2 ツール&画質テスト H264

  ガラクタ置き場(互換検証)

大百科記事では、
  ハードウェアアクセラレーション有効時に再生に問題が起きた場合は、FlashPlayerの
     「ハードウェアアクセラレーションを有効にする」
  のチェックを外したうえで動画を再読み込みする。

という対処方法が示されています。
ただし、そうするとGPUではなくCPUでデコード(ソフトウェアデコード)することになるため、
CPUの処理能力が低い場合は動画がカクついたりまともに再生できなかったりすることがあります。

上の記事やマイリスに入っているなかで、GPU再生支援で問題が起きることがあるらしいという動画を、
  解像度 フレームレート プロファイル@レベル ref bframes
のパラメータつきで3つ貼っておきます。(MediaInfo 0.7.47 で調査)
映像がおかしくなるかどうかは環境次第だとは思いますが、
ハードウェアアクセラレーションを有効にした上で視聴してみてください。
(問題が起きた場合、問題が起きた動画と、使っているグラフィックカードをコメントで教えてもらえるとありがたいです。
 勝手に動画を貼ってすみません。本当なら自分でテスト動画をアップすべきなんでしょうけど、
 作ったとしても自分では確認できないもので・・・。

2011/10/18追記:
  自分でもテスト用の動画をアップロードしてみました。640x360 24fpsのもので、
  まずいとされるエンコードオプションの値を少しずつ変えてみたものです。以下のマイリストからどうぞ。
  (自作PC板のIntelスレやコメントの反応を見ると、少なくともIntel HD Graphics 2000or3000ではref=16のもので映像が乱れるそうです。
   なお、低画質モードだとサーバー側で再エンコードされた映像を見ることになり、テストにならないのでご注意下さい。)
     ハードウェアアクセラレーション(DXVA)テスト用動画リスト

動画1. 512x384 30fps High@3.0 ref=5 bframes=3
 

動画2. 1280x720 59.94fps High@L5.0 ref=16 bframes=16
 

動画3. 512x288 29.97fps High@5.1 ref=16 bframes=16
 

また、少し古い情報ですが、

  H.264(AVC) + UVD(DXVA) / J-pro.info

  x264 Encoding Options for Hardware Compatibility & DXVA - AVS Forum

を見ると、GPU再生支援を利用するためには、エンコード時にH.264 Levelの条件をしっかり守って
--levelでレベルを明示的に指定するといったことが大事になってきたりするようです。

更に

  【ニコニコ動画】FLV/MP4エンコードスレ 53【質問】

で質問してみたところ、動き予測の参照距離(--ref)が16だとGPU再生支援が無効になったり
映像が乱れることがあるという話を教えてもらいました。

つまり、x264でのエンコード時に、ハードウェアアクセラレーション(GPU再生支援)が
きちんと働くように設定を行なうことが重要になってくるわけですね。

 
さて、ここからが本題です。

以上の情報を踏まえてニコニコ動画まとめWikiの推奨設定を見てみたところ、
レベルをきっちり守れず、refも16になってしまうケースがあることに気づきました。
これがどの程度問題になるのかはよくわかりませんし、実は全然問題ないかもしれませんが、
どうせならきっちりとした設定を考えてみたいと思い、今ある情報をまとめてみました。

長くなるので折りたたみます。
わからないことだらけですので、コメントなどいただければありがたいです。
(ここではなく「【ニコニコ動画】FLV/MP4エンコードスレ 53【質問】」のほうでも質問中なのでそちらでも。)
 

※重要
 知識が浅いため色々と間違ってる可能性があるので
 書いてあることは鵜呑みにせず厳しい目でチェックしてください。
 (大事なことなのでもう一度書きましt)

 
現在のニコニコ動画まとめWikiのH.264のエンコード設定では、
  「速度はmediumかveryslow、H.264 LevelはSDなら3程度、HDなら4か4.1」
という設定を推奨しています。(veryslowはref=16となることに注意)

しかし、例えば512x384や640x360の60fpsでは、マクロブロックの上限を考えると
最低でもLevel 3.1を指定する必要があるうえ、veryslowにしてLevel 3.1を指定した場合、
レベル指定によるref制限は働かず、ref=16となってしまいます。(詳細は以下の表を参照)

ref=16にすると、GPU再生支援(ハードウェアアクセラレーション)がうまく働かない場合があるという情報もあるため、
このあたりも含めて推奨設定の見直しや情報のとりまとめを行なったほうがよいのではないだろうかと思った次第です。

とりあえず、レベルに応じたマクロブロックに関する上限を考慮した場合の
レベル指定やref指定について、計算し、下のほうに表としてまとめてみました。
参考にしたのは以下の2つのサイトです。
  H.264/MPEG-4 AVC - Wikipedia, the free encyclopedia
  猫科研究所 - x264(vbv-maxrate,vbv-bufsize,profile,level), H.264(Profile/Level)

GPU再生支援の正確な挙動などがさっぱり理解できていないので、まだ考えているところですが、
今ある情報が全て正しいと考えた場合、個人的には
  ●veryslowの推奨はやめ、mediumのみ推奨とする
  ●レベルの指定は
     SD(縦解像度576未満)の場合は3.1
     HDの場合は4.1
    を指定するようにする
とするのが手っ取り早いのかなと思っています。
(他にもveryslowは推奨しつつrefを強制的に15以下にするとか色々な案はあると思いますが。)
  →2011/10/18修正:
    ref=15もかなりひどい設定だと思ったので削除。
    まだよくわからないけど下の表での計算結果も踏まえると
       「最大でも、SDならref<=6、HDならref<=4にとどめるのが無難」
    みたいな記述が良いのかなあ・・・。
    更に互換性を上げるなら「ref<=3」なのでしょうけど、どこまで考慮するかというだけですね。

SDとHDを分ける基準としては「縦解像度720」が使われることが多いですが、
SDの基準を縦576未満(DXVAなどではこの値で判定される)としたのは、
以下の表に示すとおり、800x600の60fpsではLvel 3.1では足りずLevel 4以上が必要になるためです。
(この解像度でアップする人はあまりいないと思いますが念のため。)

  →2011/10/18修正:
    下の表の計算結果から見て、60fpsの時にLevel 3.2以上が必要になる解像度がだいたいこれくらいからだからです。

GPU再生支援については
  「IntelのLGA1156系のチップセットによるGPU再生支援では「bframes > 3」や「ref > 6」で不具合が起きることがある」
という情報もあります。(参考記事:「魔道学研究所 動画エンコード ニコニコ動画 2011ねん9がつごう」)
これについても、速度・チューニング・プロファイルが「medium・none・high」ならbframes=3、ref=3になるので問題ないかなと。
  ※2011.10.18修正:
    よくわからんけどMediaInfoで見るとref=3を指定しているのにRefFramesが4になるので記述を保留。
    何かの理由でそうなるのでしょうけどこれから調査。

      →とりあえずの原因が判明したので記述を復活。
        --b-pyramidがnone以外だとMediaInfoのRefFramesの表示が--refと一致しなくなるみたいです。
        MediaInfoのバグなのか、何か理由があるのかはまだわかってませんが。

当然これだと画質面での不満は出てくるかもしれませんが、そのへんは各自が自己責任で追求していくべきことなのかなと思います。
まとめWkiの設定例としては「画質もそこそこで、問題を起こさないファイルの作り方」を提示できればいいのかなと。

ただ、参考情報として、GPU再生支援で不具合を起こさないための正確な条件などを
Wikiにまとめておければ、個人的にもありがたいです。
 

■よくわかってないので確認したいことなど

 ●refに関する動画再生支援の正確な挙動は?
    ・ref=16で無効になる?
    ・無効にはならないが映像が乱れる?
    ・環境や条件による?
    ・例えば640x360のLevel3.1ならref=16もレベル規定としては許容範囲だが
     その場合でも動画再生支援は無効になったり乱れたりすることがあるのか?

 ●--levelによる、refの自動調整は以下のようにMaxDpbMbsと解像度だけで決まるのか?
      最大ref数 = MIN(FLOOR(MaxDpbMbs/(CEILING(幅/16,1)*CEILING(高さ/16,1)),1), 16)
   それとも他の要素も関係する?

 ●上に書いたようにIntelのLGA1156ソケット系のグラフィックチップでのGPU再生支援では、
     ・bframes > 3
     ・ref > 6
   といった条件(andではなくorでも発生?)で、不具合が起きるらしいという情報がある。
   本当だとすると、そこそこユーザーもいるはずなので、
   まとめWikiとしてもこれを考慮した設定例にすべきなのか?
   それとも無視?

 ●これ以外にも、GPU再生支援がおかしくなったりする条件はあるのか?

 ●各社のグラフィックカード(チップ)は、どのくらいの解像度・レベルまでの再生支援をサポートしてるのか?
   以下のページとか見てみたけど、いまいちよくわからない。
     Intel GMA - Wikipedia, the free encyclopedia
     Nvidia PureVideo - Wikipedia, the free encyclopedia
     ATI Avivo - Wikipedia, the free encyclopedia
     Unified Video Decoder - Wikipedia, the free encyclopedia

 このあたりについて、参考になる情報やコメントをいただければありがたいです。
  

----- 以下は、レベルごとのマクロブロック上限に関する計算表となります -----
 

マクロブロックに関するH.264のレベル毎の上限値

   「H.264/MPEG-4 AVC - Wikipedia, the free encyclopedia」よりLevel2以上を抜粋。

   マクロブロックは16x16の大きさを1単位とするブロック。
   MBs・・・MacroBlocks
   MaxDpbMbs・・・Max Decoded picture buffer Macroblocks

   ※太字の英字表現は計算式などを表すために適当につけた仮の変数名です。

Level MaxDpbMbs
(maxDpbMbs)
Max macroblocks
MBs/sec
(maxSecMbs)
MBs/frame
(maxFrameMbs)
2 2376 11880 396
2.1 4752 19800 792
2.2 8100 20250 1620
3 8100 40500 1620
3.1 18000 108000 3600
3.2 20000 216000 5120
4 32768 245760 8192
4.1 32768 245760 8192
4.2 34816 522240 8704
5 110400 589824 22080
5.1 184320 983040 36864

           ※Level4とLevel4.1は、この3つのパラメータに関しては同じ値をもつ。

 

解像度をベースにした最低レベル計算と、レベル毎に許容される最大ref数と最大fps

   代表的ないくつかの解像度について計算。

   frameMbs = CEILING(width/16,1)*CEILING(height/16,1)
   maxRef = MIN(FLOOR(maxDpbMbs/frameMbs,1),16)
   maxFps = FLOOR(maxSecMbs/frameMbs,1)

解像度(pixel) MBs/frame
(frameMbs)
frameMbs
maxFrameMbsから
判断した
最低レベル
指定できるH.264 Levelと、
許容される最大ref数や最大fps

(width)
高さ
(height)
指定できる
H.264 Level

※3以上として
  考えている。
許容される最大ref数
(maxRef)

※MaxDpbMbsの制限を
  超えない値を計算。

※--levelでレベルを
  明示的に指定すれば
  refはこの数値以下に
  下げられる(と思うけど
  正確な挙動は不明)。

※ただし ref=16 は
  再生支援が
  効かなかったり
  映像が乱れたり
  するらしい。
許容される最大fps
(maxFps)

※MBs/secの制限を
  超えない値を計算。

※単純計算しただけの
  数値なので、
  実際にバカ高いfpsに
  してもよいわけではない。
512 288 576 2.1 3 14 70
3.1 16 187
3.2 16 375
4 16 426
4.1 16 426
4.2 16 906
5 16 1024
5.1 16 1706
512 384 768 2.1 3 10 52
3.1 16 140
3.2 16 281
4 16 320
4.1 16 320
4.2 16 680
5 16 768
5.1 16 1280
640 360 920 2.2 3 8 44
3.1 16 117
3.2 16 234
4 16 267
4.1 16 267
4.2 16 567
5 16 641
5.1 16 1068
640 480 1200 2.2 3 6 33
3.1 15 90
3.2 16 180
4 16 204
4.1 16 204
4.2 16 435
5 16 491
5.1 16 819
720 480 1350 2.2 3 6 30
3.1 13 80
3.2 14 160
4 16 182
4.1 16 182
4.2 16 386
5 16 436
5.1 16 728
720 576 1620 2.2 3 5 25
3.1 11 66
3.2 12 133
4 16 151
4.1 16 151
4.2 16 322
5 16 364
5.1 16 606
800 600 1900 3.1 3.1 9 56
3.2 10 113
4 16 129
4.1 16 129
4.2 16 274
5 16 310
5.1 16 517
1024 576 2304 3.1 3.1 7 46
3.2 8 93
4 14 106
4.1 14 106
4.2 15 226
5 16 256
5.1 16 426
1024 768 3072 3.1 3.1 5 35
3.2 6 70
4 10 80
4.1 10 80
4.2 11 170
5 16 192
5.1 16 320
1280 720 3600 3.1 3.1 5 30
3.2 5 60
4 9 68
4.1 9 68
4.2 9 145
5 16 163
5.1 16 273
1440 1080 6120 4 4 5 40
4.1 5 40
4.2 5 85
5 16 96
5.1 16 160
1920 1080 8160 4 4 4 30
4.1 4 30
4.2 4 64
5 13 72
5.1 16 120

 

「解像度とフレームレート」から、「指定すべきH.264 Levelの値と、ref値の調整の必要性」を判断するための早見表

   上の表での計算をもとに再整理したもの。

解像度(pixel) フレームレート

※1
指定すべき
最低限の
H.264 Level

※2
H.264 Levelを
明示的に
指定した後の
最大ref数

※3
備考(--refでの調整の必要性など)

※4
※5
高さ
512 288 ~70 3 ref=14 ※この解像度でLevel3.1以上を指定すると
  最大ref=16になってしまうので注意。
512 384 ~52 3 ref=10 ※この解像度でLevel3.1以上を指定すると
  最大ref=16になってしまうので注意。
53~140 3.1 ref=16 ※H.264 Levelを3.1と指定しただけでは
  最大ref=16になる可能性があるので、
  refの指定が16になっていないか
  確認し、もしなっている場合は
  明示的に15以下に下げて
  エンコードする必要がある。
640 360 ~44 3 ref=8 ※この解像度でLevel3.1以上を指定すると
  最大ref=16になってしまうので注意。
45~117 3.1 ref=16 ※H.264 Levelを3.1と指定しただけでは
  最大ref=16になる可能性があるので、
  refの指定が16になっていないか
  確認し、もしなっている場合は
  明示的に15以下に下げて
  エンコードする必要がある。
640 480 ~33 3 ref=6 ※この解像度でLevel4以上を指定すると
  最大ref=16になってしまうので注意。
34~90 3.1 ref=15
720 480 ~30 3 ref=6 ※この解像度でLevel4以上を指定すると
  最大ref=16になってしまうので注意。
31~80 3.1 ref=13
720 576 ~25 3 ref=5 ※この解像度でLevel4以上を指定すると
  最大ref=16になってしまうので注意。
26~66 3.1 ref=11
800 600 ~56 3.1 ref=9 ※この解像度でLevel4以上を指定すると
  最大ref=16になってしまうので注意。
57~113 3.2 ref=10
1024 576 ~46 3.1 ref=7 ※この解像度でLevel5以上を指定すると
  最大ref=16になってしまうので注意。
47~93 3.2 ref=8
1024 768 ~35 3.1 ref=5 ※この解像度でLevel5以上を指定すると
  最大ref=16になってしまうので注意。
36~70 3.2 ref=6
1280 720 ~30 3.1 ref=5 ※この解像度でLevel5以上を指定すると
  最大ref=16になってしまうので注意。
31~60 3.2 ref=5
1440 1080 ~40 4 または 4.1 ref=5 ※この解像度でLevel5を指定すると
  最大ref=16になってしまうので注意。 
41~85 4.2 ref=5 ※Level4.1を超えるものは
  そもそもGPU再生支援が
  効かないこともあるはず?
1920 1080 ~30 4 または 4.1 ref=4 ※この解像度でLevel5.1を指定すると
  最大ref=16になってしまうので注意。 
31~64 4.2 ref=4 ※Level4.1を超えるものは
  そもそもGPU再生支援が
  効かないこともあるはず?

※1・・・ニコニコ動画に60fps以上でアップロードする人はいないと思うので、60fpsを含む範囲のみ示しています。
※2・・・最低でもこのレベルを指定する必要があるということです。ただしレベル3以上として考えています。
※3・・・x264でのエンコード時に--levelオプションで左にあるレベルを明示的に指定すると、
     --refオプションの数値は自動的にここに示した数値以下に下げられるのではないかなという数値。
     --levelによる最大ref数の自動調整の正確な挙動がわからないので、ここではMaxDpbMbsを守るように
     調整されるものと考えています。(実際の挙動は違う可能性があります)
※4・・・レベル指定による自動調整でも最大ref=16になってしまう場合の対処。
     実際にref=16になるかどうかは、プリセットの選択などによって変わってきます。
     ref=16だとGPU再生支援時におかしくなることがあるという情報があるのでそのための対処です。
※5・・・ref=16以外の条件でもGPU再生支援がおかしくなるという情報もあるので、
     できればそのあたりもまとめて整理できると嬉しい。
     例えばIntelのLGA1156系のチップセットによるGPU再生支援では「bframes>3」や「ref>6」で異常が起きるという情報がある。

|

« 文字を3Dモデル化してAviUtl拡張編集に読み込ませる方法(立体テキストの作成) | トップページ | つんでれんこ v2.51のx264設定を、拡張x264(GUI)Ex v1.13用の設定ファイルにしてみた »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1278146/42510534

この記事へのトラックバック一覧です: ハードウェアアクセラレーション(GPU再生支援)を考慮した場合のx264エンコード設定について:

« 文字を3Dモデル化してAviUtl拡張編集に読み込ませる方法(立体テキストの作成) | トップページ | つんでれんこ v2.51のx264設定を、拡張x264(GUI)Ex v1.13用の設定ファイルにしてみた »