FireTV (4K対応モデル) がある条件下で 720p 表示しかできなかった件の調査と解決
はじめに
先日、安価なフルHD対応プロジェクタを購入した。
このプロジェクタにはネットワーク機能がなく、単体では動画配信サービスを利用できない。 そこで、FireTV とサウンドバーを接続して Amazon Prime ビデオで映画を観ようと思ったのだが、なぜか解像度が 1280x720/60Hz (720p/60Hz) となってしまった。FireTV は 4K 出力に対応しており、プロジェクタが 1920x1080/60Hz (1080p/60Hz) の表示ができることも確認済みであるため、本来は 1920x1080/60Hz での表示となるはずである。
この記事では、原因究明にあたって行った検証と、その結果についてまとめる。
構成
今回のシステム構成は以下の通りである。 各機器の間はすべて 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
- 出版社/メーカー: ホーリック
- 発売日: 2014/06/10
- メディア: エレクトロニクス
- この商品を含むブログを見る
今回は 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 の解像度選択画面である。
あっ…… pic.twitter.com/f16ykmo8S9
— td2sk (@td2sk) 2018年9月20日
1080p/60Hz がない!!!!!!!!!!!!!!!!
これには衝撃を受けた。1080p/60Hz というのは最も一般的な解像度ではないのか。720p なんて謎解像度より優先されるべきでないのか。なぜこれが使えないのか。
FireTV、 サラウンドスピーカーのパススルー、プロジェクタ、PC ディスプレイが、それぞれ単体では 1080p/60Hz を利用できることは、これまでの検証結果からはっきりしている。なのになぜ、このような現象が発生するのか。
この結果から、原因の最有力候補が定まったため、確定のための検証と解決策の検討に入った。
次項を見るまえに、読者のみなさんもぜひ原因を推理ををしてみてほしい。*3
原因
原因は「HDMI をパススルーしているサウンドバーが特定条件下で EDID から 1920x1080/60Hz の情報を削る」である。
EDID とは、映像機器をつないだ際に、機器名やメーカー名、対応解像度などをやり取りするために使われるメタデータのフォーマットである。
普段、PC をディスプレイやプロジェクタに接続すれば、自動的に解像度が変更される。 これは、機器同士が EDID をやりとりして、表示可能な解像度を認識できるからである。
EDID の CEA 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を直結した場合は1080p/60Hzが見えてる pic.twitter.com/XILZvZWD5l
— td2sk (@td2sk) 2018年9月20日
これは、プロジェクタがサポートしている解像度の一覧である。
一方、 FireTV をサウンドバーを介してプロジェクタにつないだ場合は以下のようになる。
どういうことなの…… pic.twitter.com/Ai7N1aThFx
— td2sk (@td2sk) 2018年9月20日
なぜかサウンドバーを通すと、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、 今回は、比較的安価な以下の機種を購入した。
kwmobile HDMI EDID マネージャー オーディオとビデオコントロール
- 出版社/メーカー: KW-Commerce
- メディア: エレクトロニクス
- この商品を含むブログを見る
この機種には"つまみ"がついており、EDID 内のサポート解像度/音声ch数をどの値に書き換えるか選択できる。 また、デバイスの出す EDID を記憶して、それを別の機器との接続時に再現することもできるようだ。
今回は 1080p / 5.1ch オーディオ という適切な EDID がプリセットされていたのでこれを使う。*17
そして、機器を以下のように接続する。
さて結果は
勝った! pic.twitter.com/Lml4yg8lGi
— td2sk (@td2sk) 2018年9月21日
どうすればよりよい問題解決ができたか?
ここまでの検証手順は、問題解決後に振り返りながら書いたものであって、実際には実を結ばなかった試行錯誤をいろいろしている。 どうすればもっとスムーズに解決できただろうか。 反省点は以下の通り。
- 当初はケーブルを疑いすぎており、他の原因が頭になかった
- ケーブルが問題になることは比較的よくあるが、簡単な検証で解決しなかったときは、切り分けを早い段階で実施すべきだった
- ケーブルが安すぎたので信用が置けなかった
- 念の為に2本購入していたため、個体不具合の可能性をすぐに除外できたのは良かった
- ケーブルが原因でないと分かった後、しばらくは場当たり的な検証を繰り返してしまった
- ケーブルが悪いという決めつけが間違っていたことで、思考停止に陥った
- 何をどの順で検証するか考えてから試すべきだった
- 金で解決するという選択肢の優先度を上げるべきだった
- EDID 書き換え器は 2,000円程度で買えるわけで、調査にかかった時間を考えれば、たとえこれで解決しなくても買っておくべきだった
- 早い段階でこの可能性も候補には上がっていたが、接続する機器が増えることを嫌って、検証の優先度を下げてしまった
- 1080p/60Hz で検証すべきところを、2160p/60Hz で確認してしまった
- 4K が大丈夫で FHD がダメ、ということはないという思い込み
- EDID というものの存在を知っていたのはよかった
- 知らなかったとしたら、信号の減衰等を疑ってブースターの購入・検証などを試していたと思う
- 雑学・教養レベルでも、規格・プロトコルの中身を知っておくといろいろ役立つ
最後に
FireTV を開発した Amazon にこれだけは言っておきたい。
*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:既にあったらごめん