Amazon Echo Show 5 のブラウザでWebRTCは動くのか？

# Amazon Echo Show 5

先日Amazon Echo Show 5をうっかり買ってしました（それも、PrimeDay 直前に...涙）。理由は普通のブラウザが使えるらしい、と知ったからです。

## 2種類のブラウザ

Echo Show 5 にはSilkとFirefoxの2種類のブラウザが内蔵されているようです。
最初にYouTubeを見ようとすると、どちらのブラウザをデフォルトにするかを聞かれます。
ちなみにSilkはChromiumベースとの情報を見かけました。

## Firefoxベースのブラウザ

Firefoxを起動するには「Alexa, Firefoxを起動」でOKです。

実際に動くFirefoxは、PC版とはちょっと違うもので、モバイル版がベースになっているようです。

- Firefox for Echo Show
    - https://support.mozilla.org/en-US/kb/firefox-echo-show
- Github mozilla-mobile/firefox-echo-show 
    - https://github.com/mozilla-mobile/firefox-echo-show

起動直後
![echoshow_ff_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19403/ee5d0489-b063-cb98-253b-6c2033932c9e.jpeg)

製品情報(2019.07.19 現在): Firefox for Echo Show 1.3
![echoshow_ff_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19403/ce736b0c-f617-e736-398b-9160aabbead7.jpeg)


残念ながら、YoutubeやGoogleといった特定のページを開くこと以外、音声操作はできません。タッチスクリーンで操作することになります。

## 情報表示はできない

もっと詳細な情報を取得したかったのですが、次の表示はできませんでした。
- about:config や about:* のすべて
- 開発者ツール

AndroidのFirfoxと同じように、PCとUSB接続すれば開発者ツールが見れるかもしれませんが、まだ試してません。

## 長時間起動はできない

通常のページを表示した状態では、数分でブラウザは終了し、ホームスクリーンに戻ります。
YouTubeなどの動画を表示している場合は、少なくとも1時間はそのまま表示されていました。

# Firefox for Echo Show で WebRTC 関連は動作するか？

さて本題である、WebRTC関連は動くのでしょうか？

## navigator.mediaDevices.getUserMedia()

Echo Show 5 にはカメラとマイクが付いているので、使えることが期待してしまいます。ところが実際には使えません。

- http:// の場合 .. NotSupportedError: Only secure origins are allowed
- https:// の場合 ... NotAllowedError: Permission denied

どうやらブラウザからは見えていないようです。
ちなみに http の場合に 「Only secure origins are allowed」と言われるのは、Firefox 68からの仕様です。Firefox for Echo Show 1.3は最新のFirefoxの実装をベースにしているのですね（当初は古い実装かと勘違いしてしまいました）

## RTCPeerConnection

- RTCPeerConnection はある。P2Pでの通信は可能
- Videoコーデック
    - H.264 ... NG
    - VP8, VP9 .. OK
- Audioコーデック
    -Opus ... OK
- Multistream .. 動く（複数 videoTrack 可能）
    - RTCPeerConnection.ontrack()も動く
    - ※ RTCPeerConnection.addTrack()は未確認
- Unified-Plan
    - 明示的指定をすれば動く... new RTCPeerConnection({sdpSemantics: 'unified-plan'});
    - RTCPeerConnection.addTranceiver() .. Unified-Planを明示的に指定した場合のみ利用可能（指定しないと例外）

## 連続再生

WebRTCのP2Pで映像を受信/再生している間は、ブラウザは比較的長時間起動しているようです。
正確な時間は測定できていませんが、私が試した範囲では8～10時間で終了しました。

## 関連機能

- video.srcObject ... あり
- video.play() ... ユーザージェスチャーが無いと再生できない
- canvas.captureStream() ... OK。MediaStream が取得できる

# Silkブラウザの場合

もう一方のSilkブラウザについても、軽く調べました。

- Silk ブラウザは Chromium / Blink ベース
    - Wikipedia より https://en.wikipedia.org/wiki/Amazon_Silk

## Silkブラウザの起動

私の試した限り、音声コマンドで明示的にSilkブラウザを起動することはできません。デフォルトブラウザに指定したうえで、ブラウザが必要になる動作を間接的に指示する必要があります。（YouTubeの再生）

デフォルトのブラウザの指定は次の2通りで可能です。

- 初めて「Alexa, YouTube見せて」でYouTubeを予備指した時
- 設定画面の「デバイスオプション」-「ウェブオプション」-「ブラウザ」のメニュー内


##　Silk と getUserMedia()

- http:// の場合 .. なにも起きない（例外も起きない）
- https:// の場合 ... カメラ/マイクのアクセス許可のダイアログが表示されるが、操作できない（ボタンを押しても反応しない）

## Silk と RTCPeerConnection

- P2P で映像の受信、表示は可能
- （Firefoxとは異なり）H264も利用可能


# まとめ

- カメラ/マイクを使っての配信や双方向通信はできない
- WebRTCの映像/音声をリアルタイム受信することは可能
- スキルを開発してタッチ操作なしにダイレクトに受信まで行けるかは不明（未確認）

技術的にはできることがありますが、あえて使ってうれしいかは疑問なところです。
WebRTCのような低遅延の仕組みは、何らかの双方向性があるときに有効です。Echo Showの使用範囲では、もう少し遅延があってもHLSのような仕組みが適切かもしれません。

ちょうとマッチする使い方を見つけられないか、もうしばらく頭をひねってみます。