RC3の無職しょ日記 このページをアンテナに追加 RSSフィード Twitter

2013年08月31日

Miracast よくある誤解と解説

Miracastとは

※PDF注意

画面ミラーリング配信 -> mirror cast


用語集

画面送信側と受信側のデバイスを、Source、Sinkと命名。Source機能や、Sink機器、などとして使用する。

Source

AndroidノートPC(Miracast対応ノートもあるが、WiDiのほうが多いと思う)であることがほとんど。Windowsは8.1でSourceに対応したらしい。

Miracast (Sink) アダプタ

Sink機能を内蔵していないHDMI出力機器(TVやPCのディスプレイプロジェクタとかも)を、Sink化させるもの。アダプタは、P2P接続に対応しSource機器とP2P接続→Sourceが送信した画面をHDMIへ出力→TV等で表示。

Sink

Miracast内蔵テレビや、Miracastアダプタを接続したTV等。

なお、Android 4.2のソースコードへはSink機能も実装されており、Nexus 4などの一部の機種ではSourceとしてもSinkとしても機能する ※カスタムROM必要

また、Android 4.3では、Sink機能のソースコードは一切合切削除された。今後マージがあるのかは不明。

邪推Chromecastを売りたいため、Android端末を受信側にはしない?

P2P, Wi-Fi Direct

(解説するにはスペースが足りない m(__)m)


検証端末


以下、特にAndroidの実装・動作結果と合わせていくつか誤解を解説してみる。「動かしてみたらこうだった」って話が多い。もしかすると、Miracast規格書と動作結果で差分が出てて、誤解、と表現した項目もあるのかもしれない。

誤解1 Android 4.2以降でSource機能へ標準対応している?

ややこしい話。

Android 4.2のソースコードで、Source機能が実装されている。でも、4.2のソースコードを単純にビルドしただけでは、Source機能の入り口は開かない。明示的に入り口を開く処置が必要。また、入り口を開いても、実際に正常動作するかはわからない。動かしたら再起動ループ発生とか。これはハードウェアの違いによるものだと思う。

  • N-03Eは、Android 4.0でSource機能を(恐らく独自)実装している。
  • Nexus 7(2012)は、Android 4.3でも動かない。Nexus 7(2013)では動く。
  • Nexus 10はAndroid 4.2で未対応だったけど、4.3で正式に対応した。

4.2以前の機種でも使えたり、4.3以降でも未対応だったりする。これ。これがAndroidなんだよね。Miracastに限らず。「なんでおれの端末はバージョンXXなのに、YY機能が入ってねーんだよ」

ソースコード上は実装されてるけど、動くかどうかはメーカー(の実装)依存


誤解2 (Miracast)専用のハードウェアが必要?

よく、Nexus 7(2012)でSourceが出来ない理由の一つにこれがあげられている。「Nexus 7(2012)は、Miracastハードウェアがないから、対応してないんだよ」みたいな。ここでの「Miracastハードウェア」が何を指しているのかは、不明瞭。

H.264ハードウェアエンコーダが必要

Miracastに関して、ハードウェアでネックになりそうなのは、H.264のエンコーダ。Nexus 7(2012)は、「intra-refresh-mode」に対応していないらしい。動画フォーマットに疎いのでなんともなんだけど、ブロックノイズ関係するものだと思う。

で、なんと!intra-refresh-modeの設定時に発生するエラーチェックをスルーする(return error; をコメントアウトw)と、Source機能標準で未対応だったNexus 7(2012)や、Galaxy NexusでSourceが動くようになる。

    status_t err = OK;
    int32_t intraRefreshMode = 0;
    if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) {
        err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode);
        if (err != OK) {
            ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x",
                    err, intraRefreshMode);
            //return err; // <-- ここ!
        }
    }
おれの機種でも!!

上記無理やり対応は、すべての機種へ適用できるわけではない。むしろかなり限定的かと。

Galaxy S2で上記対応後にSourceを動かすと、再起動ループにハマるw 再起動ループにはまってしまったら、adb reboot recoveryでリカバリを起動して、wipe dataすると、正常に?復帰する。一機能を実行して端末再起動ループってどういうことよ・・。

ハードがないならソフトでいいじゃない

じゃあ、ハードウェアエンコーダがないならソフトウェアエンコーダでやればいいんじゃね?

実際に、Androidのソースコード上は、H.264のソフトウェアエンコーダもある。あるにはあるが実装が中途ハンパで、実行途中で未対応終了するような実装になっている。そこをクリアできれば、ソフトウェアエンコーダでも動くんじゃないかな(棒)。


誤解3 Wi-Fiデュアルバンドが必要?

そうでもない。

誤解2同梱かな? 例によって、Nexus 7(2012)の文脈で語られることが多くて、「Nexus 7(2012)は2.4GHzしかないから(Miracastは)無理」みたいなの。

次の誤解4と合わせて、推測。例えば次のような状況を想定している?

  • 2.4GHz Wi-Fi接続。アクセスポイントへ接続し、通常のWi-Fi送受信。
  • 5GHz Sink機器とWi-Fi Direct接続。Source機能を実行し、画面ミラーリングパケットを送信。

Wi-FiとWi-Fi Directの周波数帯の割り当てを別個にすることで、効率よく、とかそういったニュアンスで言ってるのかな?と思う。「デュアルバンドが必要」派の言い分はよくわからない。

f:id:RC3:20130831112143j:image この画面


誤解4 Miracast中は、Wi-Fiが使えない?

そうでもない。

  「Wi-Fi Direct」を使用しているため、端末のデータ回線としてWi-Fiを同時利用することができない
  〜スマホの映像をワイヤレスで出力できる「Miracast」

これ。誤解2の専用ハードウェアが必要〜と共によく語られている感じ。いったいどこ情報なんだ?って思う。

推測1 Galaxy Nexus Android 4.0の名残

これはありそう。Galaxy Nexusの4.0時は、まさに表題の通り。Wi-Fiがオンになっている(アクセスポイントへの接続状態は問わない)状態で、Wi-Fi Direct オン操作をすると、「Wi-Fiがオフになります。いいですか?」といったダイアログが出ていた。Wi-Fi / Wi-Fi Directは排他利用のみだった。

で、4.1以降は、Wi-Fi / Wi-Fi Directが同時利用できるようになった。

推測2 画面転送しながら、Wi-Fiはむずかしいんじゃね?帯域的に考えて

ここで画面転送時のパケットサイズなんかを測定なり計算なりできるとかっこいいんだけど、やらない(やれない)。

f:id:RC3:20130831063716j:image Nexus 4からNexus 7(2012)へMiracast接続

ポイント

  • Nexus 4側で、画面転送しつつ、Wi-Fi接続でGoogle検索を表示している
  • Nexus 7(2012)でSinkが動いている
  • Sink側の画面表示がおかし
    • →Android 4.3でSinkのソースコードが削除されたため、4.2のコードをマージして、マージしきれていないため。

誤解5 P2P接続専用?

冒頭の wp_Miracast_20120917_Industry_JP.pdf にあるように、別にP2P接続専用ってわけじゃあない。

f:id:RC3:20130831112141j:image 接続パターン

N-03E同梱のワイヤレススクリーンボックスはWi-Fiルーター経由でSource/Sinkができてる。ワイヤレススクリーンボックスをWPSを使ってルーターへ接続。N-03Eを同一ルーターへ接続して、Sourceを実行、Sink(ワイヤレススクリーンボックス)が検索されて、接続・画面転送OK。

ワイヤレススクリーンボックス、抱き合わせ販売なのが惜しい・・。単体でも十分製品になってる。

Android 4.2のソースツリーには、Wi-Fi接続(というかIPアドレスを指定)でMiracastのテストを実行するコマンドが準備されている。


誤解6 解像度

  「Miracast」では、解像度1920×1080、60fpsのフルHD映像をワイヤレスで伝送可能、

  〜スマホの映像をワイヤレスで出力できる「Miracast」

誤解・・というより、恐らくこれは、Miracast仕様の上限の話だと思う。

仕様で規定されてても実装は・・ってことでソースコードを眺めてみる。

int32_t WifiDisplaySource::PlaybackSession::width() const {
#if USE_1080P
    return 1920;
#else
    return 1280;
#endif
}

int32_t WifiDisplaySource::PlaybackSession::height() const {
#if USE_1080P
    return 1080;
#else
    return 720;
#endif
}

4.2では、USE_1080Pを定義すれば1920x1080、定義されてなければ1280x720で画面を出している・・と思われる。ここを変更して試したことないので、実際にどう動くのかは不明。

4.3では、なんか変更入ってた。


誤解7 ??

なにかもう一つぐらいあったと思ったけど、なんだったかな。


ソース、解説、動画

ほんとかよ・・って声が聞こえてきそうなので、ソースと解説と動画を貼ってみる。特に動画では、Nexus 7(2012)をSourceにして、Wi-Fi接続して、ゲームをやってるので、誤解3&4を解けると思う。

D

D



無線画面転送のメリットがあまり見えない(´・ω・`)。MHLとかSlimPortの有線で・・

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証