WebRTC は RTP を利用して音声や映像を送受信していますが、 RTP には RTP 拡張という好き勝手に拡張できる仕組みがあります。
RFC 8285 - A General Mechanism for RTP Header Extensions
つい最近、古い RFC が上書きされたこともあり、せっかくなので WebRTC が利用している RTP 拡張について簡単に紹介してみました。
RTP 拡張については RFC 読めばわかるので割愛します。
Chrome M63
Chrome は積極的に RTP 拡張を利用しています。Chrome というよりは libwebrtc がという印象です。
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 urn:3gpp:video-orientation
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
Firefox 57
Firefox は必要最低限という印象です。あまり拡張には興味がなさそうです。
a=extmap:1/sendonly urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
RTP 拡張概要
RTP 拡張は SDP に定義し Offer/Answer でやり取りする際に対応しているかどうかを判断します。
extmap:1 の 1 をローカル ID といい、そのハンドシェイクで m= の単位で好き勝手に決めて良いと決まっています。
実際 Firefox の場合はローカル ID 1 が2つあります。これは m= で区切られているからです。
ローカル ID の後ろに /sendonly というのがありますが、これはダイレクションといい、この拡張を利用する方向を明示します。
あとは URI です。 IETF の場合は urn:ietf ... という感じです。それ以外は http:// という感じで書くルールになっています。
RTP 拡張紹介
urn:ietf:params:rtp-hdrext:ssrc-audio-level
ssrc-audio-level 拡張です。これは音声のみに利用される拡張で、その RTP パケットの音量が 0-127 で含まれてきます。
0 が一番大きな音で、127 が一番小さな音です。全ての RTP パケットに含まれます。
urn:ietf:params:rtp-hdrext:toffset
この機能は abs-send-time が対応していない場合に利用される仕組みです、WebRTC では abs-send-time には対応しているので、何も気にすることはありません。
http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
abs-send-time (Absolute Send Time) です。簡単に言うと RTP の timestamp とは別に淡々と incremnt されていく値です。といってもずーっと増えるのではなく、24 ビットです。
これを利用することで RTP の SeqNum が「古いのか新しいのか」を判断することが可能になります。便利です。
urn:3gpp:video-orientation
マニアックな拡張です。これは「角度」を取れる拡張です。90 度回転したなどのフラグが入ってきます。
受け取り側は映像が「回転したこと」に気付くことができます。
http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
ソケットから送信した順番の番号が入ってきます。これだけだと何に使うのかわからないと思います。
Transport-wide RTCP Feedback Message という RTCP フィードバックメッセージを前提としています。
これについては、長くなるので「そんなのがあるんだな」程度で。
http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
情報がなさすぎてこれわかっていません。そもそも URL が 404 です。
https://github.com/webrtc/webrtc-org/pull/117
http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
リアルタイムか、スクリーンシェアなのかなどが入ってきます。
http://www.webrtc.org/experiments/rtp-hdrext/video-timing
仕様と実装が違うので要注意です。エンコードの開始時間と終了時間が入ってきます。フレームごとのタイミング情報をおくるために使われます。
まとめ
RTP 拡張は WebRTC をブラウザで P2P として利用するには気にする必要はありません。ただ、これらの拡張を利用することで得られている統計情報もあったりしますので、chrome://webrtc-internals と仲良くなりたい人はなんとなく覚えておくことをお勧めします。
Top comments (0)