Microsoft EdgeのWebRTC対応について調査した

# はじめに

この資料は、WebRTC Meetup　Tokyo #14の発表資料です。

**注意(2020.05.25追記)**
この記事は、マイクロソフト独自開発のMicrosoft Edge（Version 44以前）について書かれたものです。Chromium版Edge(Version 79以降)以降のバージョンには当てはまりません。


---

# 自己紹介

- なかゆうすけ（@yusuke84）
- WebRTC Platform SkyWay 中の人
   - Engineer
     - Developer Relations
     - Technical Solutions Engineer
- WebRTC Meetup Tokyo 主催者の一人

---

# 前回のMeetupでEdgeの話がありました

![スクリーンショット 2017-03-23 11.56.38.png](https://qiita-image-store.s3.amazonaws.com/0/6651/a5be18ad-b667-7fe9-27b0-0f86c14f9e3a.png)

- MSのエバンジェリストさんがEdgeがWebRTC対応しているよ的な話をしてましたね

---

## Appear.inも動きます

<img width="1080" alt="appearin.png" src="https://qiita-image-store.s3.amazonaws.com/0/6651/5f332126-4b9e-a2cd-c8c4-2bbe8c81f29f.png">


---

## 時雨堂さんも対応した模様

![スクリーンショット 2017-03-23 12.02.35.png](https://qiita-image-store.s3.amazonaws.com/0/6651/001f6ee3-1cd1-f6aa-8c85-bcd18c613a3d.png)

---

# この資料の目的

- 実際にEdgeがどの程度、WebRTCの機能をサポートしているのか、もっと掘り下げて解説します。
- WebRTCを使ったWebサービスを開発されている方が、これからEdge対応する際の参考になれば良いなと考えています。

---

# Edgeのサポート状況

## 機能の開発状況

|機能分類|項目|対応状況(build 15019)|開発優先度|備考|
|:--|:--|:--|:--|:--|:--|
|Stream & Port handling| Multiple Streams & Unified Plan |WebRTC1.0は未対応<BR>ORTCは対応済み||ORTCは1つのDTLSトランスポートに複数のストリームを載せることが可能|
|| Multiplexing |対応済み||Audio/Videoのmultiplexing、RTP/RTCPのmultiplexingに対応|
|| Data Channels |未対応<BR>[Edge Platform status - 検討中](https://developer.microsoft.com/en-us/microsoft-edge/platform/status/rtcdatachannels/)|優先度低||
|| Media Recorder |未対応<BR>[Edge Platform status - 検討中](https://developer.microsoft.com/en-us/microsoft-edge/platform/status/mediarecorder/)|優先度低|ハードウェアサポートが有るH.264を想定|
| Security & Encryption | No HTTPS requirement|HTTP/HTTPS両方で動作する||今後、利用状況をモニタリングしHTTPSオンリーに変更する可能性がある。|
||“IP Leakage” prevention|対応済み<BR>ローカルIPアドレスの候補を収集しないようにするオプションを `about:flags` で提供||エンタープライズ用途ではグループポリシーを使って一括設定可能。|
|| Screen sharing security |未サポート<BR>[Edge Platform status - 検討中](https://developer.microsoft.com/en-us/microsoft-edge/platform/status/screencapture/)|優先度中|理想としては、Windowsプラットフォームの権限設定機能と連携し、拡張機能は使わずにユーザが機能を有効化出来るようにしたい。EdgeはディフォルトONにしたい。|
|| ECDSA Support |DTLS1.2とECDSA（楕円曲線暗号スイート）はWin10アニバーサリーサポートで対応済み。<BR> Certificate Management API は実装していないため、証明書は作れない。||ディフォルトはRSA証明書を生成する。<BR>DTLS1.0とRSAしかもってないデバイスへの後方互換対応については検討中|
|| Device Fingerprinting |未対応||永続的なuser Permissionはサポートしていない。<BR>ユーザが許可を与えない限りキャプチャデバイスのリストに表示されることはない。<BR>セッションとしてdeviceidは保持しない。|
| Codec & Video Support | ORTC & 1.0 Parity | H.264/AVC,VP8はWebRTC1.0とORTC API両方で利用可能<BR>G.264/UC,SILK、extended telemetryはORTCのみ利用可能||
| Audio|Opus|対応済み||`Opus Audio Playback`は現在開発中。|
||FEC(パケットエラー補正)|未対応||Opus internal FECは未対応だが、CN(Comfort Noise)、VADはOpusで対応している|
||RED（冗長化）|対応済み||Opusで利用できるが、相互運用性はテストしていない|
||RTX(再送)|対応済み|||
||G.729|未対応||G.711,G.722,Opus,SILK,DTMF,CNには対応している|
|Video|H.264/AVC|対応済み||WebRTC1.0とORTC両方で利用可能<BR><BR>サポート仕様<BR>- packetization-mode=1（RFC7742)<BR>- Constrained Baseline Profile with Level up to 4.2<BR>- Google REMB,Absolute send time header extension<BR>- Picture Loss Indication(PLI)<BR>- Generic NAC(RFC4585)<BR>- Retransmission(RTP再送)(RFC4588)|
||VP8|対応済み||ディフォルトONでWebRTC1.0とORTC両方で利用可能|
||VP9|未対応|VP9の動画再生は可能だが、RTC用のコーデックとしては利用できない。|
||SVC & Simulcast|Edge ORTCではH.264/UCにてSVC＆Simulcastによるencodingとdecodingに対応<BR>H.264/AVCとVP8におけるSVC＆Simulcastは未対応||現在対応項目として含まれていない。ただし、VP8はTemporal Scalabilityのデコードが利用可能。エンコードとしては対応予定はなし。|
||RTX, FEC, ULPFEC, RED|RTX（再送）は対応済み（WebRTC1.0、ORTC両方で利用可）<BR>RED+ULPFECは検討中<BR>flexible FECは未対応|RED+ULPFECは優先度中|
||PLI,NACK,REMB|全て対応済み|||
||Video Interop|H.264/AVC、VP8のビデオコーデックサポートに加えて、PLI、NACK FBメッセージ (RTP/SAVPF)、輻輳制御(REMB)、RTX(再送）に対応済み（全てWebRTC1.0とORTCで利用可）|||
|ICE＆TURN|Trickle-ICE Support|未対応|優先度中|だが、15019で既に利用できる。詳しくは後述|
||TURN Variations|TURN(RFC5766),TURN IPv6(RFC6156),ICE-TCP(RFC6544)に対応済み<BR>Allocation of TCP candidates（RFC 6062）は未対応<BR>TURN over TCP/TLSは検討中|TURN over TCP/TLSは優先度中||
|その他|Stats API|msStats APIにてORTCの情報を取得できる。|||

- 参考文献
  - http://internaut.com:8080/~baboba/iit-tutorial/slides/edge.pdf
  - https://webrtchacks.com/windows-uwp-webrtc/
  - http://qiita.com/yusuke84/items/1a52d9f734a78fa2cb66

---

# 実際に検証してみました

- 前提：build 150019で検証しています。最新は15063なので細かな仕様変更があるかもしれません。（リリースノートレベルでは何もありませんでしたが）

---

## 　Edgeの癖

- RTCPeerConnectionの `iceServers` にSTUNサーバを指定するとエラーになる。（これはORTCでもそうで、STUNサーバは受け付けない）
- TURNサーバを用意する必要あり

```js
{"iceServers":[ {"urls":"turn:turn.skyway.io:443?transport=udp","username":"xxxxx","credential":"xxxxx"} ]};
```

---

## Trickle ICEが既に動作する

- 対応していないということだったが、 `pc.onicecandidate` , `pc.addIceCandidate` 共に動作し利用できる

---

## 念のためにMultiStreamの動作も確認した

- Audio/Videoをトラック追加して、Audio２トラック、Video2トラックの４トラック状態でOffer SDPを生成したが動作せず
- `addTrack`,`getVideoTracks`,`getAudioTracks`については動作した

---

## （参考）Edgeが生成するSDP

### Trickle ICE版

```
v=0
o=- 5490060217672355606 0 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=group:BUNDLE audio video
m=audio 9 UDP/TLS/RTP/SAVPF 111 9 0 8 105 13 126
c=IN IP4 0.0.0.0
a=rtpmap:111 opus/48000/2
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=rtcp:9 IN IP4 0.0.0.0
a=setup:active
a=mid:audio
a=maxptime:60
a=sendrecv
a=ice-ufrag:8n1F
a=ice-pwd:oiLbCg1ci90zxzy4adrseWtn
a=fingerprint:sha-256 C4:5B:6A:6C:F5:6C:00:13:D2:C3:B2:95:31:1A:6F:23:80:17:DB:F4:13:35:C6:35:2D:57:90:C8:BF:9D:7A:92
a=ssrc:583533957 cname:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583533957 msid:DB9D0BF6-C88F-44FD-8691-AF34A4272844 CE6A7804-0653-4BD6-9DE8-874568D3D986
a=ssrc:583533957 mslabel:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583533957 label:CE6A7804-0653-4BD6-9DE8-874568D3D986
a=rtcp-mux
m=video 9 UDP/TLS/RTP/SAVPF 100 107 96 99
c=IN IP4 0.0.0.0
a=rtpmap:100 VP8/90000
a=rtpmap:107 H264/90000
a=rtpmap:96 rtx/90000
a=rtpmap:99 rtx/90000
a=fmtp:100 packetization-mode=1;mst-mode=NI-TC
a=fmtp:107 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42c02a
a=fmtp:96 apt=100
a=fmtp:99 apt=107
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=rtcp-fb:107 nack
a=rtcp-fb:107 nack pli
a=rtcp-fb:107 goog-remb
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=setup:active
a=mid:video
a=sendrecv
a=ice-ufrag:8n1F
a=ice-pwd:oiLbCg1ci90zxzy4adrseWtn
a=fingerprint:sha-256 C4:5B:6A:6C:F5:6C:00:13:D2:C3:B2:95:31:1A:6F:23:80:17:DB:F4:13:35:C6:35:2D:57:90:C8:BF:9D:7A:92
a=ssrc:583534057 cname:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583534057 msid:DB9D0BF6-C88F-44FD-8691-AF34A4272844 6D9E69A8-C1E6-4C56-A966-C1769B2FAA99
a=ssrc:583534057 mslabel:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583534057 label:6D9E69A8-C1E6-4C56-A966-C1769B2FAA99
a=ssrc:583534058 cname:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583534058 msid:DB9D0BF6-C88F-44FD-8691-AF34A4272844 6D9E69A8-C1E6-4C56-A966-C1769B2FAA99
a=ssrc:583534058 mslabel:DB9D0BF6-C88F-44FD-8691-AF34A4272844
a=ssrc:583534058 label:6D9E69A8-C1E6-4C56-A966-C1769B2FAA99
a=ssrc-group:FID 583534057 583534058
a=rtcp-mux
a=rtcp-rsize
```

### Candidate（抜粋）

```
"candidate:3 1 udp 33553407 xxxx:x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 33066 typ host", sdpMid: "audio", sdpMLineIndex: 0
"candidate:5 1 tcp 1684797439 xxx.xxx.xxx.xxx 3526 typ…rflx raddr xxx.xxx.xxx.xxx rport 3526 tcptype active", sdpMid: "audio", sdpMLineIndex: 0
```

### Vanilla ICEの場合

```
v=0
o=- 4876039618903095554 0 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=group:BUNDLE audio video
m=audio 4288 UDP/TLS/RTP/SAVPF 102 9 0 8 97 13 118 101
c=IN IP4 172.16.0.217
a=rtpmap:102 opus/48000/2
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 RED/8000
a=rtpmap:13 CN/8000
a=rtpmap:118 CN/16000
a=rtpmap:101 telephone-event/8000
a=rtcp:9 IN IP4 0.0.0.0
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=setup:actpass
a=mid:audio
a=maxptime:60
a=sendrecv
a=ice-ufrag:HToE
a=ice-pwd:PeuHvesQZxyiGU6Fy9aEV+K5
a=fingerprint:sha-256 BC:E5:83:A5:0F:40:06:C4:54:9F:51:0F:BD:43:EE:29:65:82:BD:96:49:62:DB:F9:7A:CF:34:76:76:AA:73:A2
a=candidate:1 1 udp 2130706431 xxx.xxx.xxx.xxx 4288 typ host
a=candidate:2 1 udp 2130705919 xxxx:x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 9752 typ host
a=candidate:3 1 udp 33553407 xxxx:x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 28872 typ host
a=candidate:5 1 tcp 1684797439 xxx.xxx.xxx.xxx 4288 typ srflx raddr xxx.xxx.xxx.xxx rport 4288 tcptype active
a=ssrc:2576747288 cname:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747288 msid:AB888BBA-94C5-4F5C-A2D8-440F191274AB 3B8CF0F5-F428-4CD4-89A0-4A86E95303BB
a=ssrc:2576747288 mslabel:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747288 label:3B8CF0F5-F428-4CD4-89A0-4A86E95303BB
a=rtcp-mux
a=rtcp-rsize
m=video 9 UDP/TLS/RTP/SAVPF 99 107 96 100
c=IN IP4 0.0.0.0
a=rtpmap:99 rtx/90000
a=rtpmap:107 H264/90000
a=rtpmap:96 rtx/90000
a=rtpmap:100 VP8/90000
a=fmtp:99 apt=107;rtx-time=3000
a=fmtp:107 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42c02a
a=fmtp:96 apt=100;rtx-time=3000
a=fmtp:100 packetization-mode=1;mst-mode=NI-TC
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-fb:107 nack
a=rtcp-fb:107 nack pli
a=rtcp-fb:107 goog-remb
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=setup:actpass
a=mid:video
a=sendrecv
a=ice-ufrag:HToE
a=ice-pwd:PeuHvesQZxyiGU6Fy9aEV+K5
a=fingerprint:sha-256 BC:E5:83:A5:0F:40:06:C4:54:9F:51:0F:BD:43:EE:29:65:82:BD:96:49:62:DB:F9:7A:CF:34:76:76:AA:73:A2
a=ssrc:2576747388 cname:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747388 msid:AB888BBA-94C5-4F5C-A2D8-440F191274AB C98E3E0B-1744-4BA1-AE44-CFC9939B81C2
a=ssrc:2576747388 mslabel:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747388 label:C98E3E0B-1744-4BA1-AE44-CFC9939B81C2
a=ssrc:2576747389 cname:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747389 msid:AB888BBA-94C5-4F5C-A2D8-440F191274AB C98E3E0B-1744-4BA1-AE44-CFC9939B81C2
a=ssrc:2576747389 mslabel:AB888BBA-94C5-4F5C-A2D8-440F191274AB
a=ssrc:2576747389 label:C98E3E0B-1744-4BA1-AE44-CFC9939B81C2
a=ssrc-group:FID 2576747388 2576747389
a=rtcp-mux
a=rtcp-rsize
```

## MultiStream

### Edgeの場合

- Audio/Videoをトラック追加して、Audio２トラック、Video2トラックの４トラック状態でOffer SDPを生成したが動作せず
  - `addTrack`,`getVideoTracks`,`getAudioTracks`については動作した
 
```
v=0
o=- 7109637118066294576 0 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS BFC9ADA1-3022-414B-9117-9E18D36B789C
a=group:BUNDLE audio video
m=audio 9 UDP/TLS/RTP/SAVPF 102 9 0 8 97 13 118 101
c=IN IP4 0.0.0.0
a=rtpmap:102 opus/48000/2
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 RED/8000
a=rtpmap:13 CN/8000
a=rtpmap:118 CN/16000
a=rtpmap:101 telephone-event/8000
a=rtcp:9 IN IP4 0.0.0.0
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=setup:actpass
a=mid:audio
a=maxptime:60
a=sendrecv
a=ice-ufrag:sNJi
a=ice-pwd:mpjiVtdsVOrdwJ/nM8vgPUnW
a=fingerprint:sha-256 B2:CE:14:D1:5C:2E:46:FC:41:84:BA:EB:05:77:7F:36:C6:21:1A:EA:1F:58:CA:1C:C6:5C:E9:E2:7A:1E:30:11
a=ssrc:1124057924 cname:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124057924 msid:BFC9ADA1-3022-414B-9117-9E18D36B789C 67D1C186-26E0-40C1-BB1F-DDE610F46267
a=ssrc:1124057924 mslabel:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124057924 label:67D1C186-26E0-40C1-BB1F-DDE610F46267
a=rtcp-mux
a=rtcp-rsize
m=video 9 UDP/TLS/RTP/SAVPF 99 107 96 100
c=IN IP4 0.0.0.0
a=rtpmap:99 rtx/90000
a=rtpmap:107 H264/90000
a=rtpmap:96 rtx/90000
a=rtpmap:100 VP8/90000
a=fmtp:99 apt=107;rtx-time=3000
a=fmtp:107 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42c02a
a=fmtp:96 apt=100;rtx-time=3000
a=fmtp:100 packetization-mode=1;mst-mode=NI-TC
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-fb:107 nack
a=rtcp-fb:107 nack pli
a=rtcp-fb:107 goog-remb
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=setup:actpass
a=mid:video
a=sendrecv
a=ice-ufrag:sNJi
a=ice-pwd:mpjiVtdsVOrdwJ/nM8vgPUnW
a=fingerprint:sha-256 B2:CE:14:D1:5C:2E:46:FC:41:84:BA:EB:05:77:7F:36:C6:21:1A:EA:1F:58:CA:1C:C6:5C:E9:E2:7A:1E:30:11
a=ssrc:1124058024 cname:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124058024 msid:BFC9ADA1-3022-414B-9117-9E18D36B789C CF73978B-E139-4BA3-B677-D980DE3DF2C9
a=ssrc:1124058024 mslabel:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124058024 label:CF73978B-E139-4BA3-B677-D980DE3DF2C9
a=ssrc:1124058025 cname:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124058025 msid:BFC9ADA1-3022-414B-9117-9E18D36B789C CF73978B-E139-4BA3-B677-D980DE3DF2C9
a=ssrc:1124058025 mslabel:BFC9ADA1-3022-414B-9117-9E18D36B789C
a=ssrc:1124058025 label:CF73978B-E139-4BA3-B677-D980DE3DF2C9
a=ssrc-group:FID 1124058024 1124058025
a=rtcp-mux
a=rtcp-rsize
```

### (参考)Chromeの場合

```
v=0
o=- 729419066758698405 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
m=audio 50260 UDP/TLS/RTP/SAVPF 102 9 0 8 13 118 101
c=IN IP4 172.16.0.156
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:3507182495 1 udp 2122262783 xxxx:x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 63030 typ host generation 0 network-id 2 network-cost 10
a=candidate:1032279807 1 udp 2122194687 xxx.xxx.xxx.xxx 50260 typ host generation 0 network-id 1 network-cost 10
a=ice-ufrag:tcca
a=ice-pwd:pVKIgrT1Fl1MGQiGlzu4gZ7a
a=fingerprint:sha-256 89:F3:B9:EF:8E:A4:08:16:B7:34:31:FE:95:A7:65:FB:E5:F0:C9:08:9E:7A:07:9A:E0:0F:20:0D:E7:90:D7:F9
a=setup:active
a=mid:audio
a=sendrecv
a=rtcp-mux
a=rtpmap:102 opus/48000/2
a=fmtp:102 minptime=10;useinbandfec=1
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:118 CN/16000
a=rtpmap:101 telephone-event/8000
a=ssrc:852272730 cname:Y7zMVlJNh+cbosnY
a=ssrc:852272730 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA ff097ff4-117e-46b5-a665-3576a5558efb
a=ssrc:852272730 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:852272730 label:ff097ff4-117e-46b5-a665-3576a5558efb
a=ssrc:2727587040 cname:Y7zMVlJNh+cbosnY
a=ssrc:2727587040 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA ccf609b2-c8fd-4a2a-aaec-7469e505aa93
a=ssrc:2727587040 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:2727587040 label:ccf609b2-c8fd-4a2a-aaec-7469e505aa93
m=video 9 UDP/TLS/RTP/SAVPF 99 107 96 100
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:tcca
a=ice-pwd:pVKIgrT1Fl1MGQiGlzu4gZ7a
a=fingerprint:sha-256 89:F3:B9:EF:8E:A4:08:16:B7:34:31:FE:95:A7:65:FB:E5:F0:C9:08:9E:7A:07:9A:E0:0F:20:0D:E7:90:D7:F9
a=setup:active
a=mid:video
a=extmap:1 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=107
a=rtpmap:107 H264/90000
a=rtcp-fb:107 nack
a=rtcp-fb:107 nack pli
a=rtcp-fb:107 goog-remb
a=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=100
a=rtpmap:100 VP8/90000
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=ssrc-group:FID 36461750 3444642770
a=ssrc:36461750 cname:Y7zMVlJNh+cbosnY
a=ssrc:36461750 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA 32c4b19c-f34f-456a-a909-cb392f48d544
a=ssrc:36461750 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:36461750 label:32c4b19c-f34f-456a-a909-cb392f48d544
a=ssrc:3444642770 cname:Y7zMVlJNh+cbosnY
a=ssrc:3444642770 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA 32c4b19c-f34f-456a-a909-cb392f48d544
a=ssrc:3444642770 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:3444642770 label:32c4b19c-f34f-456a-a909-cb392f48d544
a=ssrc-group:FID 4154513763 2493581106
a=ssrc:4154513763 cname:Y7zMVlJNh+cbosnY
a=ssrc:4154513763 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA d8091ebe-c80a-495d-85dc-34464418a2cf
a=ssrc:4154513763 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:4154513763 label:d8091ebe-c80a-495d-85dc-34464418a2cf
a=ssrc:2493581106 cname:Y7zMVlJNh+cbosnY
a=ssrc:2493581106 msid:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA d8091ebe-c80a-495d-85dc-34464418a2cf
a=ssrc:2493581106 mslabel:f2Z7xcj2ZY4Fxk8mQuns669llPCLGvK8tBHA
a=ssrc:2493581106 label:d8091ebe-c80a-495d-85dc-34464418a2cf
```

---

# Adapter.jsの利用について

- [aboba氏の資料](http://internaut.com:8080/~baboba/iit-tutorial/slides/edge.pdf　)によれば
  - そのまま使い続けることをおすすめしている
  - Adapter.jsを使ったテストも手動だけどMS内部でやっているようだ
  - マルチストリーム等の高度なユースケースにはまだ対応しないので、adapter.jsでカバーして欲しい
    - Edge RTPスタックへの実装が必要だがまだユースケースがWIPなので


---

# デモ

- 今回はSkyWayで公開している[skyway.js](http://nttcom.github.io/skyway/alpha-release.html)で必要な改修を行うとP2PのMediaConnectionは利用可能
- SkyWayとしての公式対応時期は未定

---

## 改修ポイント

### STUNサーバの指定を削除

- Before

```js
    this.defaultConfig = {
      iceServers: [{
        urls: 'stun:stun.skyway.io:3478',
        url:  'stun:stun.skyway.io:3478'
      }],
      iceTransportPolicy: 'all'
    };
```

- After

```js
    this.defaultConfig = {
      iceTransportPolicy: 'all'
    };
```

---

### TURNSにはまだ対応していないので削除

- Before

```js
var turnCombinations = [{ protocol: 'turn', transport: 'tcp' }, { protocol: 'turns', transport: 'tcp' }, { protocol: 'turn', transport: 'udp' }];
```

- After

```js
var turnCombinations = [{ protocol: 'turn', transport: 'tcp' }, { protocol: 'turn', transport: 'udp' }];
```

---

### urlスキーマには対応していない
 
- Before

```js
              var iceServer = {
                urls: protocol + ':' + util.TURN_HOST + ':' + util.TURN_PORT + '?transport=' + transport,
                url: protocol + ':' + util.TURN_HOST + ':' + util.TURN_PORT + '?transport=' + transport,
```

- After

```js
              var iceServer = {
                urls: protocol + ':' + util.TURN_HOST + ':' + util.TURN_PORT + '?transport=' + transport,
```

---

### 3. 繋がった

![skyway.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6651/ce4a3475-6ff7-22ed-03da-c3b5d89d22cc.jpeg)

---

## peer.jsは？

- 上記ポイントを修正してもICE Transportの確立に失敗し動作しませんでした
- Candidateの交換タイミングとかが原因かもしれません

---

## 我如古さんの手動シグナリングは？

- このハンズオン資料のコードで上記ポイントを修正すれば動作します
  - http://qiita.com/yusuke84/items/43a20e3b6c78ae9a8f6c

---

# 終わりに

- MSには複数のWebRTCプロジェクトがある
  - EdgeのWebRTC/ORTC対応
  - Skype for WebのWebRTC/ORTC対応
  - WebRTC for UWP

---

## WebRTC for UWPが今後くるかもしれない

- GoogleのOSSのWebRTCエンジンを使用し頻繁に追従している
- OSSのエンジンをベースにしているがマルチプラットフォームや非力なデバイス向けの最適化がなされている
- クロスプラットフォームで開発動作する。Nugetでライブラリが公開されている
  - https://www.nuget.org/packages/WebRtc/
  - https://github.com/webrtc-uwp/webrtc-windows
- 詳しくはこちら
  - [New Windows into WebRTC with UWP: Q&A with Microsoft’s James Cadd](https://webrtchacks.com/windows-uwp-webrtc/)

---

# ご清聴ありがとうございました