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