td2sk の日記

技術メモとかゲームとか

FireTV (4K対応モデル) がある条件下で 720p 表示しかできなかった件の調査と解決

はじめに

先日、安価なフルHD対応プロジェクタを購入した。

このプロジェクタにはネットワーク機能がなく、単体では動画配信サービスを利用できない。 そこで、FireTV とサウンドバーを接続して Amazon Prime ビデオで映画を観ようと思ったのだが、なぜか解像度が 1280x720/60Hz (720p/60Hz) となってしまった。

FireTV は 4K 出力に対応しており、プロジェクタが 1920x1080/60Hz (1080p/60Hz) の表示ができることも確認済みであるため、本来は 1920x1080/60Hz での表示となるはずである。

この記事では、原因究明にあたって行った検証と、その結果についてまとめる。

構成

今回のシステム構成は以下の通りである。 f:id:td2sk:20180921210504p:plain 各機器の間はすべて HDMI ケーブルで接続している。 また、サウンドバーには 4K/60Hz の HDMI2.0 信号をパススルーする機能がついており、サウンドバー/プロジェクタ双方に HDMI 信号を送るためにこれを利用している。

また、FireTV の設定画面に表示される、この構成で選択可能な解像度は以下の通りである。*1

  • 自動
  • 720p/60Hz
  • 720p/50Hz

サウンドバー、プロジェクタには解像度固定機能が存在しないため、これら機器の設定による解決も不可能である。

調査

原因としてまず疑ったのは、サウンドバーとプロジェクタを接続する HDMI ケーブルである。

HORIC ハイスピードHDMIケーブル 5.0m ゴールド 4K/60p HDR 3D HEC ARC リンク機能 HDM50-014GD

HORIC ハイスピードHDMIケーブル 5.0m ゴールド 4K/60p HDR 3D HEC ARC リンク機能 HDM50-014GD

HDMI は高速デジタル信号を取り扱うため、どうしても長距離伝送が難しく、特に 4K/60Hz (18Gbps)などの 帯域を限界まで使う場合に問題が生じやすい。そのため、一般的な HDMI2.0 フルスペック対応ケーブルは、長さが 5m 以下に制限される。 *2

今回は 1080p であるため、ケーブルの長さや質に対する要求はそこまでシビアではない。しかし、5m のケーブルを利用していること、スペックの割に安価であることから、ケーブル原因説を最初に検証した。

仮説 映像ソース サウンドバーの有無 HDMIケーブル 映像出力先 結果 ここから言えること
(最初に試した構成) FireTV あり 5m プロジェクタ 720p/60Hz ?
ケーブルの初期不良? FireTV あり 5m(別のケーブルに交換) プロジェクタ 720p/60Hz 別のケーブルでも再現するため、ケーブルの初期不良や断線の可能性は低い
安価なケーブルのため、長距離で高解像度の伝送ができない? PC なし 5m PC ディスプレイ 2160p/60Hz ケーブル自体は4Kも通せるため、長距離減衰が原因とは考えにくい
本当にケーブルの問題なのか? FireTV あり 1m (別のケーブル) プロジェクタ 720p/60Hz 十分短い別のケーブルでも再現するため、そもそもケーブルの問題とは考えにくい

検証により、ケーブル自体は問題ないことがわかった。よって、原因は機器にあると考えられる。

さて、次は FireTV の挙動を検証することにした。 プロジェクタとサラウンドスピーカーは少し前に入手しており、それぞれ単体では、 PC と接続した際に 1920x1080/60Hz で動作することは確認できていたからである。

そこで以下の検証を行った。

仮説 映像ソース サウンドバーの有無 HDMIケーブル 映像出力先 結果 ここから言えること
FireTVに問題がある? FireTV なし なし(直結) プロジェクタ 1080p/60Hz FireTV単体の問題ではない
FireTV以外の機器でも1080pは出ない? ChromecastUltra あり 5m プロジェクタ 1080p/60Hz 問題なく1080p出力される

この検証結果は、FireTV 単体に原因があるとしては説明できない。そのため、原因は複数機器の接続によって生じていることがわかった。 ありうる組み合わせは 4 つだが、ここまでの検証でいくつかの可能性は除外される。

  • FireTV と プロジェクタ → 直結の場合は問題なかったため除外
  • FireTV と スピーカー
  • スピーカーとプロジェクタ → Chromecast とつないだ際は問題なかったため除外
  • 3 つ全て

このうち、FireTV と スピーカー の組み合わせについて調べるため、以下検証を行った。

仮説 映像ソース サウンドバーの有無 HDMIケーブル 映像出力先 結果 ここから言えること
FireTVとスピーカーの組み合わせに問題がある? FireTV あり 5m PC ディスプレイ 2160p/60Hz FireTVとスピーカーの組み合わせも原因ではなさそう

さて、こうなると 3 つ全ての組み合わせによる問題なのだろうか。 そうなるといずれかの機器を買い換えなければいけないが、買い替えて動く保証もない。

しかし、ここであることに気がついた。

FireTV とサラウンドスピーカー、PC ディスプレイをつないだときの、FireTV の解像度選択画面である。

1080p/60Hz がない!!!!!!!!!!!!!!!!

これには衝撃を受けた。1080p/60Hz というのは最も一般的な解像度ではないのか。720p なんて謎解像度より優先されるべきでないのか。なぜこれが使えないのか。

FireTV、 サラウンドスピーカーのパススルー、プロジェクタ、PC ディスプレイが、それぞれ単体では 1080p/60Hz を利用できることは、これまでの検証結果からはっきりしている。なのになぜ、このような現象が発生するのか。

この結果から、原因の最有力候補が定まったため、確定のための検証と解決策の検討に入った。

次項を見るまえに、読者のみなさんもぜひ原因を推理ををしてみてほしい。*3

原因

原因は「HDMI をパススルーしているサウンドバーが特定条件下で EDID から 1920x1080/60Hz の情報を削る」である。

EDID とは、映像機器をつないだ際に、機器名やメーカー名、対応解像度などをやり取りするために使われるメタデータのフォーマットである。

普段、PC をディスプレイやプロジェクタに接続すれば、自動的に解像度が変更される。 これは、機器同士が EDID をやりとりして、表示可能な解像度を認識できるからである。

EDIDCEA EDID Timing Extension data format - Version 3 の項目をみると

(中略)
 14  480p2x         4:3     8:9       54.0                1440x480p @ 59.94/60 Hz
 15  480p2xH       16:9    32:37      54.0                1440x480p @ 59.94/60 Hz
 16  1080p         16:9     1:1      148.5               1920x1080p @ 59.94/60 Hz
 17  576p           4:3    16:15      27.0                 720x576p @ 50 Hz
 18  576pH         16:9    64:45      27.0                 720x576p @ 50 Hz
 19  720p50        16:9     1:1       74.25               1280x720p @ 50 Hz
(中略)

などと解像度の定義が並んでいる。先頭のカラムが解像度の ID である。 たとえば、1080p と 720p50 をサポートする機器は、ID 16 と 19 を送信する、という具合である。

さて、本題に戻ろう。

FireTV に ADB で接続して*4、logcat を眺めてみよう。 FireTV の HDMI 出力をプロジェクタに直接接続すると、EDID に含まれる対応解像度一覧が表示される。*5

これは、プロジェクタがサポートしている解像度の一覧である。

一方、 FireTV をサウンドバーを介してプロジェクタにつないだ場合は以下のようになる。

なぜかサウンドバーを通すと、EDID から 1080p60Hz が抜け落ちてしまう。 "パススルー"とはなんだったのか……。

おそらく、サウンドバー自身が音声信号を読み取る都合上、EDID のうち音声に関するものは、"映像機器とサウンドバー双方がサポートするもの"を提示する必要があり、そのため EDID を書き換えるようになっているのだろう。その際に、解像度のサポート範囲まで書き換わってしまうようだ。

今回利用しているサウンドバー(YAS-108)の EDID に関する振る舞いを検証してみたが

  • 機種名やメーカー名は書き換えず、プロジェクタの返す値をパススルー
  • 対応解像度については、何らかの条件で一部が書き換わる
    • ChromecastUltra のときは 1080p/60Hz を利用できていたため、必ず 1080p が欠落するとも限らない

という、なんともスッキリしない結果が得られた。この状況を説明する合理的な仮説はいくつか立てられるが、私の環境では検証が難しいため、ここでは触れない。*6

残念ながら私は HDMI の専門家ではないので、HDMI 信号をダンプして解析するような専用ハードウェアは持ち合わせていないし*7、問題の解決にこれ以上の調査*8は必要ないため、解決策の検討に移る。

解決

原因さえ分かれば解決は難しくない。

まず真っ先に思いつくのが、EDID を無視して解像度を設定するという手である。*9 サウンドバー自体は 1080p/60Hz をサポートしているので*10、EDID にこの解像度が含まれなくても問題はないはずだ。

しかし残念なことに、FireTV の設定画面にこの機能は見当たらなかった。

また、FireTV の隠しコマンド*11で非常用の解像度変更ツールが起動するが、ここでも EDID でリストアップされた解像度しか選択できない。

他にも、FireTV は Android ベースなので、ADB で接続して解像度を直接変更する*12という手段もありうる。 だがこれには root 権限が必要なため、今回は断念した。*13

root 不要の方法としては、FireTV の settings コマンドがある。これは、ADB 経由で FireTV の設定項目を直接変更するためのコマンドである。
解像度に関する設定は secure 名前空間amazon_settings_hdmi_resid という変数で指定できる。 この変数には、前述の EDID の解像度リストの ID を指定する。

(中略)
 14  480p2x         4:3     8:9       54.0                1440x480p @ 59.94/60 Hz
 15  480p2xH       16:9    32:37      54.0                1440x480p @ 59.94/60 Hz
 16  1080p         16:9     1:1      148.5               1920x1080p @ 59.94/60 Hz
 17  576p           4:3    16:15      27.0                 720x576p @ 50 Hz
 18  576pH         16:9    64:45      27.0                 720x576p @ 50 Hz
 19  720p50        16:9     1:1       74.25               1280x720p @ 50 Hz
(中略)

1080p/60Hz は 16 なので、コマンドは次のようになる。

$ settings put secure amazon_settings_hdmi_resid 16
$ reboot

しかしこのコマンドでも、EDID に指定されている解像度でなければ反映されなかった。*14

残念ながらソフトウェアによる解決法はなさそうだ。 *15 なのでハードウェアを探そう。

EDID に起因する不具合は"まれによくある"問題のようで、これに対処するため、EDID の内容を自由に設定できる機能を持った機器が販売されている。 このような製品はピンキリで、高いものは数百ドルするが*16、 今回は、比較的安価な以下の機種を購入した。

この機種には"つまみ"がついており、EDID 内のサポート解像度/音声ch数をどの値に書き換えるか選択できる。 また、デバイスの出す EDID を記憶して、それを別の機器との接続時に再現することもできるようだ。

今回は 1080p / 5.1ch オーディオ という適切な EDID がプリセットされていたのでこれを使う。*17

そして、機器を以下のように接続する。

f:id:td2sk:20180922084056p:plain

さて結果は

どうすればよりよい問題解決ができたか?

ここまでの検証手順は、問題解決後に振り返りながら書いたものであって、実際には実を結ばなかった試行錯誤をいろいろしている。 どうすればもっとスムーズに解決できただろうか。 反省点は以下の通り。

  • 当初はケーブルを疑いすぎており、他の原因が頭になかった
    • ケーブルが問題になることは比較的よくあるが、簡単な検証で解決しなかったときは、切り分けを早い段階で実施すべきだった
    • ケーブルが安すぎたので信用が置けなかった
      • 念の為に2本購入していたため、個体不具合の可能性をすぐに除外できたのは良かった
  • ケーブルが原因でないと分かった後、しばらくは場当たり的な検証を繰り返してしまった
    • ケーブルが悪いという決めつけが間違っていたことで、思考停止に陥った
    • 何をどの順で検証するか考えてから試すべきだった
  • 金で解決するという選択肢の優先度を上げるべきだった
    • EDID 書き換え器は 2,000円程度で買えるわけで、調査にかかった時間を考えれば、たとえこれで解決しなくても買っておくべきだった
    • 早い段階でこの可能性も候補には上がっていたが、接続する機器が増えることを嫌って、検証の優先度を下げてしまった
  • 1080p/60Hz で検証すべきところを、2160p/60Hz で確認してしまった
    • 4K が大丈夫で FHD がダメ、ということはないという思い込み
  • EDID というものの存在を知っていたのはよかった
    • 知らなかったとしたら、信号の減衰等を疑ってブースターの購入・検証などを試していたと思う
    • 雑学・教養レベルでも、規格・プロトコルの中身を知っておくといろいろ役立つ

最後に

FireTV を開発した Amazon にこれだけは言っておきたい。

解像度を強制変更する設定画面は絶対に用意しろ*18*19

*1:FireTV は Android ベースであり、つまりは Linux である。root が取れればなんとでもなるのだが……

*2:非常に高価なケーブルでは10m超、場合によっては100mというものもあるが、これは HDMI の信号を光ファイバーに載せ替える等、伝送方式が異なっている

*3:これはミステリ小説ではないので、フェアな出題でないことはあらかじめ断っておく

*4:FireTV は Android ベースなので ADB が使える

*5:このログの直前に、EDID の生のバイナリデータのダンプも表示される。他にどんなデータがやりとりされているのか、面白いので各自で調べてみてほしい

*6:例えば、スピーカーのファームウェアがパススルーできる対応解像度の数に上限があるとか

*7:数百ドルから入手できるようだ

*8:サウンドバーのファームウェアのバイナリに関係する EDID が埋め込まれていないかと調べてはみたが、ちょっとの手間で解析できるようなものではなさそうだった

*9:PC にはある

*10:ChromecastUltra での実験結果より

*11:リモコンの<<キーと上キーを同時長押し

*12:例えば echo 1080p60hz > /sys/class/display/mode とか

*13:最新の FireTV は root 取れるんですかね?

*14:設定画面上では反映されたように見えるのだが、実際の設定時に EDID のチェックが入るようで、結局 720p に自動設定されてしまう

*15:あったら教えてください

*16:HDCP2.2 を HDCP1.4 にダウングレードするといういろいろ危なそうな機能がついていたりするらしい

*17:H: 1080p 3D 5.1ch という項目を選択した

*18:変更後に OK を押さなければ時限で元に戻る、PCでお馴染みのアレ。FireTV にもそれらしい隠し機能はあるが、結局 EDID の提示する解像度しか選ばせてもらえない

*19:既にあったらごめん