DEV Community

voluntas
voluntas

Posted on • Edited on

WebRTC が利用している RTP 拡張の簡単な紹介

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)