74. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PC Object PC Object
SDP A SDP A
SDP BSDP B
Candidate A Candidate A
Candidate BCandidate B
localStreamAlocalStreamB
互いのMediaStreamオブジェクトを取得して、Video
要素に流し込む
互いのMediaStreamオブジェクトが取得できたら、
Video要素に流し込む
78. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PeerConnectionオブジェクトを擬似的に作成する(2)
※ここはわりとEdgeの実装に合わせてゴニョゴニョ
してる
if (config && config.iceTransportPolicy) {
switch (config.iceTransportPolicy) {
case 'all':
case 'relay':
this.iceOptions.gatherPolicy = config.iceTransportPolicy;
break;
case 'none':
// FIXME: remove once implementation and spec have added this.
throw new TypeError('iceTransportPolicy "none" not supported');
}
}
if (config && config.iceServers) {
// Edge does not like
// 1) stun:
// 2) turn: that does not have all of turn:host:port?transport=udp
this.iceOptions.iceServers = config.iceServers.filter(function(server) {
if (server && server.urls) {
server.urls = server.urls.filter(function(url) {
return url.indexOf('transport=udp') !== -1;
})[0];
return true;
}
return false;
});
}
82. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PC Object PC Object
.createOffer()
処理が盛り沢山
1. WebRTC 1.0準拠のSDPをJSで生成
2. ローカルICE Candidateを収集
var iceGatherer = new RTCIceGatherer(self.iceOptions);
iceGatherer.onlocalcandidate = function(evt) {
:
:
3. Ice and Dtls Transportを生成
var iceTransport = new RTCIceTransport(iceGatherer);
var dtlsTransport = new RTCDtlsTransport(iceTransport);
4. RTPSender/Receiverを生成
var rtpSender = new RTCRtpSender(track, transports.dtlsTransport);
var rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);
88. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PC Object PC Object
SDP A
.setRemoteDescription()
OfferのSDPを解析し必要なオブジェクトを生成
1. ローカルICE Candidateを収集
var iceGatherer = new RTCIceGatherer(self.iceOptions);
iceGatherer.onlocalcandidate = function(evt) {
:
:
2. Ice and Dtls Transportオブジェクトを生成
var iceTransport = new RTCIceTransport(iceGatherer);
var dtlsTransport = new RTCDtlsTransport(iceTransport);
3. RTPSender/Receiverオブジェクトを生成
var rtpSender = new RTCRtpSender(track, transports.dtlsTransport);
var rtpReceiver = new RTCRtpReceiver(transports.dtlsTransport, kind);
4. 相手のSDPを保管
this.remoteDescription = description;
103. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PC Object PC Object
SDP A SDP A
SDP BSDP B
Candidate A Candidate A
Candidate BCandidate B
.onaddstream() .onaddstream()
createOffer()の処理の中で生成した、 rtpReceiver から
RemoteのMediaStreamTrackを取り出し、MediaStreamオブ
ジェクトにaddTrack()し、 WebRTC 1.0のイベントでプログ
ラム側にコールバックする
104. MediaCapture MediaCapture
localStreamA localStreamB
PeerConnection PeerConnection
PC Object PC Object
SDP A SDP A
SDP BSDP B
Candidate A Candidate A
Candidate BCandidate B
.onaddstream() .onaddstream()
setRemoteDescription()の処理の中で生成した、 rtpReceiver
からRemoteのMediaStreamTrackを取り出し、MediaStream
オブジェクトにaddTrack()し、 WebRTC 1.0のイベントでプ
ログラム側にコールバックする