今回は、TVTestを全画面(フルスクリーン)表示したときの音ズレ(映像崩れ)を治す方法がわかったので備忘録的に書いておきます。

(内容に修正あり:2018/06/23:解決方法の部分を追記修正しました。)

*今回の記事で初回するものは、PCが少々特殊な環境なので、一部の方にだけ適用可能だと思われる対策方法です。あらかじめご了承ください。
ご自身のPCで適用できるかどうかは、以下の内容にてご自身でご判断ください。

■現象

TVTestでTV放送をライブで再生しているとき、これを全画面(フルスクリーン)表示すると、音声のみが先行して再生され、映像は2~3秒ほど大きく遅れて再生される。
そればかりか、ときどき映像が崩れブロックノイズのようなものが表示されることもある。

なお、いったん録画してしまえば、録画済みのファイルを全画面表示で再生してもこのような音ズレは起こりませんでした。

■異常が起きる環境

GPUが2種類搭載されているPC。
私のノートパソコンは、次の2種類のGPUが搭載されています。

・Intel HD Graphics 530
・Nvidia GeForce GTX 950M

その他の情報:
CPU:Intel Core i7-6700HQ(第6世代)  2.60GHz

メモリ: 16GB
OS:Windows 10 Home バージョン1803 ビルド17134.112(現時点での最新版にアップデート済み)

(参考までに)
いろいろなサイトによると、TVTestの設定にある、[再生]の[音声レンダラのクロックを使わない]をOFFにしてみたり、バッファの設定を変えてみたり、このあたりを変更したら治る場合もあるそうですが、私はそれでは治りませんでした。
このTVTestの設定変更で治す方法については、ネットで“TVTest 音ズレ”で検索すれば修正方法がたくさん出てくると思いますので、そちらを参照してください。
一方、以下に記載する記事では、それらの方法とは全く違う切り口で異常な現象を治しています。この方法はNvidiaが搭載され、ドライバがインストールされていないと使えない方法です。

■解決方法

結論から先に書いておきます。
原因と解決法を書きます。

今回の現象は、nvidiaコントロールパネルの[3D設定の管理]の設定が原因でした。
この設定の[優先するグラフィックス プロセッサ]の指定が問題でした。



図のように、現象が起きていたときは、[優先するグラフィックス プロセッサ]の設定

"高パフォーマンス NVIDIA プロセッサ "

になっていました。

(追記:2018/06/23)

 

****** 追記修正ここから *****

解決法としては、この設定を次の項目に変更します。
"自動選択"

実はこれは工場出荷時の状態でして、つまり、工場出荷時の状態に戻せば大丈夫だったわけです。
 

以前示した上記の解決法では、「自動選択」を選ぶと書きました。

しかしこれだと、同じTVTestでも、場合によって(それがどういうときなのかははっきりしませんが)「NIIDA」が選ばれてしまうことがあるようです。自動で「NIIDA」が選ばれてしまうと、現象が再現してしまいます。

そこで、明示的に「統合型グラフィックス(私のPCではIntel)」を選んだ方が良いと思います。ただし、優先グラフィックス(グローバル設定)で統合型グラフィックスを選んでしまうと、そのソフトの時でも統合型が選ばれてしまうこともあると思います。そこで、ここでは、TVTestだけに確実に統合型グラフィックスが選ばれるようにした方が良いので、グローバルではなく[プログラム設定]タブの方でTVTestを使うときに統合型グラフィックスを使うように指定します。

 

・設定方法

[プログラム設定]タブで[カスタマイズするプログラムを選択する]のところで、TVTestを指定します。

もし、[カスタマイズするプログラムを選択する]のボックスでTVTestが表示されないときは、右の[追加]ボタンでTVTestを追加で指定することができます。

 

****** 追記修正ここまで *****

■詳細(原因の発生と、治すまでのいきさつ)

●そもそもの原因発生のいきさつ

このノートパソコンを買ったとき、Nvidia GeForceが載っているから、よりよい映像パフォーマンスが得られるだろうと期待していました。

私は、このGPUのパフォーマンスを知りたくて、TVTestを実行しながら、タスクマネージャの[パフォーマンス]タブで、GPU0(Intel HD Graphics 530)とGPU1(Nvidia GeForce GTX 950M)の比較をしてみたのです。
そうしたら、なぜかTVTestの再生中にGPU1の値は常に0%のままでした。

もしかしてNVIDIAの方が上手く設定されてなくて、その結果、GPUが生かされていないのではないか(というか全く動いていない)と考えてしまいました。
そこで私は、nvidiaコントロールパネルの[3D設定の管理]の設定で、[優先するグラフィックス プロセッサ]の設定を"高パフォーマンス NVIDIA プロセッサ "にしてしまったのでした。

実際、[優先するグラフィックス プロセッサ]の設定を"高パフォーマンス NVIDIA プロセッサ "にすると、TVTest動作時に、GPU0(Intel)だけでなく、GPU1(NVIDIA)も同時に動くようになり、Intelにかかっていた負担の半分がNVIDIAに割り振られるようになりました。
これですっかり気をよくした私は、ワナにはまったというわけです。

 

ただ、よくよく考えれば、「3D」の設定のところで、2DであるTVTestが改善するというのも変な話で、その時点で怪しく思うべきでした。

3Dの設定変更で、なんで2Dの方まで影響があるのでしょうか。それは今でもわからないままです。

●GPUの設定方法が、正直よくわかっていない

私は素人ですので、「NVIDIA GPUが動いていれば、パフォーマンスはより高くなるだろう」と安易に考えてしまいました。
だから、TVTestを動かしたとき、ビデオ処理をIntelのGPU1つだけでやるよりも、NVIDIAにも半分担当するように設定変更してしまったのです。

たぶん、GPUの正しい使い方を、私は理解していないのでしょう。
もっとGPUの使い方を勉強しなければなりませんね。

●TVTestの設定をいろいろ変更しても無駄だった。

現象が起きるようになってから、(もうすっかりNVIDIAの設定変更のことは忘れていて)、TVTestの設定にばかり気を取られました。
主にTVTestのmpeg-2デコーダをLAVやffdshow、TVTest DTV Video デコーダなど、いろいろ変えてみたがダメでした。
ネットの情報から、[再生]の[音声レンダラのクロックを使わない]をOFFにしてみたり、バッファの設定を変えてみたり、このあたりをいろいろ実験したけど、結局改善はしなかったのです。

●もう一度、タスクマネージャでGPU0とGPU1の動作を観察してみた

もう一度、タスクマネージャでGPU0とGPU1の動作を観察してみました。
これはGPU1の動作の動作をモニタリングするときに参考になると思いますので、一読してみてください。
以下に示す図は、TVTestを表示している時のものです。

【パターンA】
nvidiaコントロールパネルの[3D設定の管理]の設定で、[優先するグラフィックス プロセッサ]の設定を"高パフォーマンス NVIDIA プロセッサ "にしているとき

 

(注意:図のグラフの表示について)
GPU0もGPU1も、グラフの中央あたりでグラフが急に立ち上がっています(値が増加しています)。

これは、前半(グラフ左側)ではTVTestを普通のウインドウ表示にしていて、後半(グラフ右側)では全画面表示に変えたためです。
 

***

 

図のように、GPU0(Intel)とGPU1(NVIDIA)は同時に動いています。グラフィックの負担は、ぱっと一瞬見た感じでは、だいたいGPU0とGPU1が1:2の割合ぐらいで負担している感じがします。(後半で書きますが、この見方は間違いだったようです。)
また、TVTestが普通の大きさの画面の時と比べ、全画面(フルスクリーン)表示をしたときの方が、GPUへの負担が一気に2倍ほど増加することがわかりました。

 

【パターンB】
nvidiaコントロールパネルの[3D設定の管理]の設定で、[優先するグラフィックス プロセッサ]の設定を"自動選択"にしているとき



この場合は、図のように、負担はGPU0(Intel)だけにかかっています。GPU1はずっと0%のまま推移します。
また、こちらも、TVTestが普通の大きさの画面の時と比べ、全画面(フルスクリーン)表示をしたときの方が、GPUへの負担が一気に2倍ほど増加することがわかりました。

●きわめて素人的な考察(注:根拠無しです。)

素人的に考えると、これだけを見ると、パターンAの方が高パフォーマンスになる気がしてしまいます。

見た目だけで判断してしまうのが、私の悪いところ。


パターンBではすべての負担を1つのGPUで負担しているのですから、パターンAで負担されているGPU2つ分の負担を、1つのGPUが担当していることになります。
でも、もし本当にそうなら、2台分を足し算した場合、全画面(フルスクリーン)表示状態では、パターンBでは、GPU0の値はこの足し算した値になるはずなので、100%を超える数値(図では計算上では105%ですね)となってしまうはずです。
でも実際には、Intel GPUの負担はパターンBでさえ、100%にもならないどころか、せいぜい42%程度となっています。
 

たぶんこれは、Intel GPUとNVIDIAのGPUの“表示における尺度”自体が違うからではないかと思われます。

素人なので、以下の計算は全然違うかもしれませんが、私は以下のように考えています。

Intel GPUの負担で、パターンBの数値からパターンAの数値を引き算したものが、パターンBでNVIDIAのGPUが負担していた分と考えられます。

 

42% - 36% = 6% ・・・ これがNVIDIAのGPUが負担していた分と思われる。

 

これをNVIDIAのGPUの方で表示すると、パターンAのように「79%」と表示されるということなのではないでしょうか。

 

Intel GPUにとっては6%にすぎない負担が、NVIDIAのGPUには79%に相当するほどの高負担になるということ。

NVIDIAのGPUは、そんなに非力なのでしょうか?

非力なGPUに処理も渡したがために、全画面表示のようにGPUに負担がかかる作業では表示が間に合わなくなり、その結果、音が先行して映像が2秒も遅れるということになったということでしょうか?

じゃぁ、なんのためにわざわざNVIDIAのGPUを別途乗せて、パソコンの表面に「NVIDIA搭載シール」が張ってあるんでしょうね。

うーん、なんかよくわかりません。

もしかしたら、(実はこのパソコンはメーカーの再生品の中古品のため)、NVIDIA GPUが正常に動作していないのかな?とも思います。
ドライバは最新ですが、IntelもNVIDIAも、PCメーカー提供のものからIntelやNVIDIA純正のものに変えています。そういう所も影響している可能性は考えられます。でもいまのところ、PCをメーカー提供の古いものに戻すつもりはないのですが。。。

●でも、とりあえず治った

しかし、結局TVTestの設定を変更しても直らなかったので、やっぱりGPU関係なんだろうなぁと思って、ダメ元でもう一致度nvidiaの設定を自動設定に戻してみたら、あっさり治ってしまったということです。
ここにたどり着くまで、けっこう悩みましたし、時間もかかりました。
とりあえずは、しばらくはこれで様子を見たいと思います。

 

(追記:2018/06/23)

「自動設定」にしても、時々変なときがあったので、タスクマネージャの[パフォーマンス]タブでもう一度GPUの様子を調べました。

すると、自動設定であっても、TVTestの設定を変更したようなとき(たとえば、MPEG-2デコーダを変更したときなど)、GPU1つまりNVIDIAが有効になってしまうことがあることがわかりました。

そこで、上の解決法で追記修正したように、「自動設定」ではなく、TVTestに内蔵グラフィックスを明示的に指定してやることで、TVTestが実行されるときに確実に内蔵グラフィックスだけが動くように変更しました。

ただそれでもちょっと心配です。

それぞれのMPEG-2デコーダのプロパティにはハードウエアを使用する設定があるデコーダがあるはずで、その設定によってはもしかしたらNVIDIAが有効になってしまうかもしれないからです。その場合は、それぞれのデコーダの時にNVIDIAを使わないように個別に設定し直すしかないかもしれません。

 

最後までお読み頂き、ありがとうございました。