Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SDP for WebRTC

iwashi
November 26, 2022

SDP for WebRTC

WebRTCのSDPについて、WebRTC Meetup Tokyo #10 にて説明した際の資料です。

音声つき解説はコチラから:
https://www.youtube.com/watch?v=cUquMAf9Ayw

iwashi

November 26, 2022
Tweet

More Decks by iwashi

Other Decks in Technology

Transcript

  1. 3

  2. 9

  3. 10

  4. 柔軟にメディア疎通するためには 通信条件のネゴシエーションが必要 19 昔々 最近 条件が一緒なので ネゴシエーション不要 Aが使える Aが使える VP8とH264

    が使える VP8だけ 使える VP8とH264が使えるよ、と申し出る VP8だけ使えるよ、と答える ネゴシエーションで柔軟に通信条件を変更できる! 通信条件は簡単には変えられない…
  5. SDPはオファー(Offer)とアンサー(Answer)の 記述方法(RFC4566の表現形式) 21 VP8とH264が使えるよ、と申し出る VP8だけ使えるよ、と答える オファー(Offer) アンサー(Answer) Agent (Offerer) Agent

    (Answerer) メディア(音声・映像・データ) <SDPの例> v=0 o=- 7919192553830045546 2 IN IP4 127.0.0.1 s=- t=0 0 a=group:BUNDLE video a=msid-semantic: WMS IJaEuKH4cYDg9YxONEt16knZtoFuZZ4ioQRq m=video 51986 RTP/SAVPF 100 116 117 96 c=IN IP4 192.168.123.1 a=rtcp:51986 IN IP4 192.168.123.1 a=candidate:964645231 1 udp 2122260223 (略)
  6. オファーアンサー(O/A)モデルには セッション(親) と メディア(子) の概念がある 22 Agent (Offerer) Agent (Answerer)

    セッション (複数のメディアを含む総体) 音声メディア 映像メディア データメディア 補足:メディアとは、実際の音声ストリームデータ等を指す
  7. そのためSDPにも ①セッション記述部 と ②メディア記述部 がある 23 v=0 o=mozilla...THIS_IS_SDPARTA-37.0 256835513207089710 0

    IN IP4 0.0.0.0 s=- t=0 0 以下、略 m=audio 59540 RTP/SAVPF 109 9 0 以下、略 ①セッション記述部 ②メディア記述部
  8. 25 SDPの文法則 • <type>=<value>で規定する 例:v=0 • <type>=<value>に余計な空白文字を含めてはいけない 例:`v = 0`

    はNG • メッセージ中にあらわれる行の出現順序は 厳密に規定されている(例: v, o, s, t) # この辺を間違えると、SDP Parse Error 補足:実際にはもっとたくさんありますが、重要と考えるのだけ
  9. 27 SDPのO/A制約[1] • m=行の数はオファーとアンサーで 同一になっている必要があること (Answer) m=audio m=video(Camera) (無) (Offer)

    m=audio m=video(Camera) m=video(ScreenShare) 補足:実際にはもっとたくさんありますが、重要と考えるのだけ
  10. 28 SDPのO/A制約[2] • メディアの登場順序は同一であること (Answer) m=audio m=video(ScreenShare) m=video(Camera) (Offer) m=audio

    m=video(Camera) m=video(ScreenShare) 補足:実際にはもっとたくさんありますが、重要と考えるのだけ
  11. ①セッション記述部から 30 v=0 o=mozilla...THIS_IS_SDPARTA-37.0 256835513207089710 0 IN IP4 0.0.0.0 s=-

    t=0 0 以下、略 m=audio 59540 RTP/SAVPF 109 9 0 以下、略 ①セッション記述部 ②メディア記述部 以降、 Chrome利用者のが多い気がするので、ChromeのSDPで説明します。 SDPは以下のサイトにて、Chrome v50 で作成したものです。 https://webrtc.github.io/samples/src/content/peerconnection/munge-sdp/
  12. 31 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu SDPエリア 解説エリア 先に凡例
  13. 32 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・SDPのバージョン ・RFC4566より 0 固定
  14. 33 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・Originの略 ・o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address> ・知っておいた方が良いのは、<sess-id>。 他のセッションとの識別のために利用されている。 一意であれば良いので、クライアントによって値が全然違う。
  15. 34 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・Session nameのこと ・`-` しか設定されないので説明略
  16. 35 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・start-time と stop-time ・RFC4566にて両方とも0を指定と規定
  17. 36 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 (書かれてないもの) a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・SDP自体(RFC4566)に規定されている i= / u= / e= / p= / r= / z= などはWebRTCで利用しないので省略
  18. 37 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・a=XX は全て拡張属性 ・a=groupはRFC5888で定義される ・もともとLipSyncなどをグルーピングする仕様 ・後ろに出てくるaudio/video/data などは、 メディア記述部で、 a=mid:audio とリンク ・WebRTCでは…
  19. 38 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・WebRTCでは、a=group(RFC5888)を拡張してBUNDLEを定義し audio/video/dateを1つに多重化して利用している ・少しでも利用するポート数を減らして、 効率的に通信するのがWebRTCのやり方 詳細はコチラ: https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-29
  20. 39 v=0 o=- 3471158663735344000 2 IN IP4 127.0.0.1 s=- t=0

    0 a=group:BUNDLEaudio video data a=msid-semantic: WMS QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ・やや古い記法なので、あまり真面目に覚えなくてOK (Chromeにまだあるが、いつか変わるはず) ・一応補足すると・・・ a=msid:XX を新たに定義して、WMS(WebRTC Media Stream) で利用するという意味。WMSを指定してWebRTCであることを 明示していたが、どうせWebRTCしか使わないので、意味薄。 https://tools.ietf.org/html/draft-ietf-mmusic-msid-12
  21. ②メディア記述部 40 v=0 o=mozilla...THIS_IS_SDPARTA-37.0 256835513207089710 0 IN IP4 0.0.0.0 s=-

    t=0 0 以下、略 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 (略) m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96 97 98 (略) m=application 9 DTLS/SCTP 5000 ①セッション記述部 ②メディア記述部
  22. ②メディア記述部 41 v=0 o=mozilla...THIS_IS_SDPARTA-37.0 256835513207089710 0 IN IP4 0.0.0.0 s=-

    t=0 0 以下、略 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 … ①セッション記述部 ②メディア記述部 以降ではAudioのみ説明 ∵videoやapplicationは、audioが読めれば分かるため。 どうしても読むのが難しい内容だけ、最後に補足。
  23. 42 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・m=audioで音声通信をすることを意味 ・続く「9」は、本来ポート番号を書く欄であるが TrickleICEでは「9」を設定する https://tools.ietf.org/html/draft-ietf-mmusic-trickle-ice-02 ・UDP/TLS/RTP/SAVPFはproto指定だが、 ひとまずおまじないと考えておいて良い https://tools.ietf.org/html/rfc5764
  24. 43 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・続く111~126はペイロードタイプであり、a=rtpmap:XX とリンク ・説明はrtpmap:XXが出てきたときに実施 ・ポイントは、この順序が左側にあるほど優先度が高い点 (数字の大小は、優先度に関係無い点に注意)
  25. 44 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・c=IN IP4 0.0.0.0 はコンタクトアドレス(メディアの送り先のIPアドレス)を書く行 ・IN = Internet の IPv4 の 0.0.0.0 のアドレスという意味だが、 アドレスから分かるようにSDP上の値は暫定値 ・実際のアドレスは、TrickleICEで取得されるため
  26. 45 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・rtcp とあることから分かるように、RTCP向けの情報であり、 前行の c= と、ほぼ同じ形式になっている ・RTCPは、RTPと多重化するのであまり意識する必要はない ・読み方は c= と一緒 ・rtcp:9 の9は、TrickleICE用のdummyポート
  27. 46 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・ice-ufragは ICE Username Fragmentの略 ・Fragmentの意味は破片であり、ICEでは通信するペア同士の ufragを結合して、ユーザネームを作成する ・ice-pwdはICE Passwordの略で、ufragと併せて、 STUN Short-term credentialの仕組みで利用する (short-term credentialは、短期的な通信相手同士の認証というイメージ)
  28. 47 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・DTLSの証明書のfingerprint ・WebRTCでは、ICEによる疎通が成功した後に、 DTLSのハンドシェイクをはじめるが、 その際にCertificateを互いに交換する。 その際のCertificateが正しいかどうかを確認するために、 このFingerprintを用いる。
  29. 48 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:9 IN IP4 0.0.0.0 a=ice-ufrag:47rxaO74RBacCqx3 a=ice-pwd:QlFMPNexQW+NgXV3G2f1DBbe a=fingerprint:sha-256 23:E7:A4:A2:CA:49:81:36:CA:08:50:27:71:5B:76:FD:61:A9:1A:30:38:27:75:BC:D7:8B: 21:EC:AC:20:3E:83 a=setup:actpass ・どちらがtcpコネクション確立を開始するかどうか規定 ・actpassはコネクションを待ち受けてもいいし、 自ら始めても良いという意味 ・offer側がactpassを設定するように、使用で定義されている https://tools.ietf.org/html/rfc5763#section-5
  30. 49 (セッション記述部) a=group:BUNDLEaudio video data ~~~略~~~ (メディア記述部) a=mid:audio ・midは media

    stream identification のこと https://tools.ietf.org/html/rfc5888 ・SDPのどの部分とメディアが対応できるか識別できる ・上記の例では、 a=mid:audioが含まれるm=行ブロックを BUNDLE対象に指定しているという意味
  31. 52 a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time a=sendrecv a=rtcp-mux ・方向属性を意味していて、全部で4種類ある ・sendrecv:送受信両方 ・sendonly:送信のみ

    ・recvonly:受信のみ ・inactive:何もしない ・今回は、送受信両方しますという意味。 配信系のユースケースとかだと、*onlyを多用することになる。
  32. 54 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 ~~~略~~~ a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10; useinbandfec=1 ・m=行で説明を割愛したペイロードタイプの番号は、 a=rtpmapなどの項目にリンクしてくる ・やっていることは、111番で利用するコーデックや その他オプションの指定
  33. 55 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 ~~~略~~~ a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10; useinbandfec=1 ・opusというコーデック・48000hz・2ch という意味
  34. 56 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 ~~~略~~~ a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10; useinbandfec=1 ・トランスポート全体での輻輳制御向けの拡張 https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
  35. 57 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 ~~~略~~~ a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10; useinbandfec=1 ・minptimeというのは、音声をパケット化するときの 最小のミリ秒の数値。この例は最小10ミリ秒でパケットを作成 ・useinbandfecは1の場合は、インバンド(RTPのストリーム内で 実施という意味なはず)でFECを提供
  36. 58 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8

    106 105 13 126 ~~~略~~~ a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 a=rtpmap:9 G722/8000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:106 CN/32000 a=rtpmap:105 CN/16000 a=rtpmap:13 CN/8000 a=rtpmap:126 telephone-event/8000 ・opus以降の詳細説明は割愛 ・覚えておくと良いのは、0-95まではスタティックペイロードで 96-127までがダイナミックペイロードということ ・例えば、黒電話でも使われる PCMU は0番と決まっている。
  37. 59 a=ssrc:1665280581 cname:/6cn4x08FotE9GHG a=ssrc:1665280581 msid:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ed198241- 0a4f-4bd0-a254-ae5d8fefb928 a=ssrc:1665280581 mslabel:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu a=ssrc:1665280581

    label:ed198241-0a4f-4bd0-a254-ae5d8fefb928 ・PlanBという古い記法であり、将来的にはUnifiedPlanという 記法に変更になる ・記法というよりは、中に記載されている内容を理解すべき
  38. 60 a=ssrc:1665280581 cname:/6cn4x08FotE9GHG a=ssrc:1665280581 msid:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu ed198241- 0a4f-4bd0-a254-ae5d8fefb928 a=ssrc:1665280581 mslabel:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu a=ssrc:1665280581

    label:ed198241-0a4f-4bd0-a254-ae5d8fefb928 ・SSRCは、Synchronization Source Identifier のことで、 要は、メディアストリームを一意に識別するためのもの ・msidは、MediaStream Identificationのことで、 JavaScript上から見えるメディアストリームのIDと 紐付けするためのもの
  39. m=videoをちょっと補足 62 v=0 o=mozilla...THIS_IS_SDPARTA-37.0 256835513207089710 0 IN IP4 0.0.0.0 s=-

    t=0 0 以下、略 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 (略) m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96 97 98 (略) m=application 9 DTLS/SCTP 5000 ①セッション記述部 ②メディア記述部
  40. 63 a=rtpmap:100 VP8/90000 a=rtcp-fb:100 ccmfir a=rtcp-fb:100 nack a=rtcp-fb:100 nack pli

    a=rtcp-fb:100 goog-remb a=rtcp-fb:100 transport-cc a=rtpmap:101 VP9/90000 a=rtcp-fb:101 ccmfir a=rtcp-fb:101 nack a=rtcp-fb:101 nack pli a=rtcp-fb:101 goog-remb a=rtcp-fb:101 transport-cc a=rtpmap:116 red/90000 ・ビデオもコーデックが多く存在 ・注目すべきは、VP8とVP9がStableで標準サポートされている点 ・VP8はNW帯域を多く使うが、CPU消費は小さめ ・VP9はNW帯域を少なく使うが、CPU消費は多め
  41. 64 a=ssrc-group:FID 3668517244 500761633 a=ssrc:3668517244 cname:/6cn4x08FotE9GHG a=ssrc:3668517244 msid:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu eb062ea9-8ed0-49ca-b878- db2f27ebd99d

    a=ssrc:3668517244 mslabel:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu a=ssrc:3668517244 label:eb062ea9-8ed0-49ca-b878-db2f27ebd99d a=ssrc:500761633 cname:/6cn4x08FotE9GHG a=ssrc:500761633 msid:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu eb062ea9-8ed0-49ca-b878- db2f27ebd99d a=ssrc:500761633 mslabel:QWrTC0fFpuTPjbHgxCZwj4peXYLEib2RnaJu a=ssrc:500761633 label:eb062ea9-8ed0-49ca-b878-db2f27ebd99d ・ChromeではMultiStreamを指定しなくても、 Videoで複数SSRCが流れる ・この2つ目のストリームはRTX(再送ストリーム) http://www.ietf.org/rfc/rfc4588.txt