WebRTC API

getUserMedia 获得的流 stream.getAudioTracks 方法和 stream.getVideoTracks 方法,分别返回音轨和视轨的数组, 每个音轨和视轨,有一个kind属性,表示种类(video或者audio),和一个label属性(比如FaceTime HD Camera (Built-in))。
// 连接已经建立后添加 track 需要重新发送 offer 和处理 answer

// track disabled 或者不消费 chrome 将不能读取到 stats 的 audioLevel,而 Safari 可以

add_transceiver_from_kind 才能保证后面的 track 传输保持 id

new RTCPeerConnection(configuration);

// 新建数据通道 或者 添加媒体流数据通道 之后才能在gotDescription中获得自己的网络通信元数据
pc.createDataChannel("sendChannel");
// pc.addStream(stream);

// 创建链接或者应答链接请求 pc.createOffer(gotDescription); pc.createAnswer(pc.remoteDescription, gotDescription);

// gotDescription 中设置自己的网络通信的元数据并将其发送给对方
pc.setLocalDescription(desc);
signalingChannel.send(JSON.stringify({ "sdp": desc }));
// 接受方收到就 pc.setRemoteDescription

// 通过 ice 就发生 ice 候选事件,有可选数据就主动发送自己的 通信内容的元数据 给对方
pc.onicecandidate = function (evt) {
signalingChannel.send(JSON.stringify({ "candidate": evt.candidate }));
};
// 接收方添加ICE候选:
pc.addIceCandidate(new RTCIceCandidate(signal.candidate));
// 获取接收通道
pc.ondatachannel = function(event) {
event.channel.onmessage;
}