class WebRtcPlayer {
|
/**
|
* WebRtc播放器
|
* @param {Element} ele
|
*/
|
constructor(ele) {
|
this.ele = ele
|
// this.PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
|
this.PeerConnection = window.RTCPeerConnection
|
|
}
|
Open (url) {
|
if (this.localpc) {
|
this.Close()
|
}
|
this.localpc = new this.PeerConnection(null)
|
const AudioTransceiverInit = {
|
direction: 'recvonly',
|
sendEncodings: []
|
}
|
const VideoTransceiverInit = {
|
direction: 'recvonly',
|
sendEncodings: []
|
}
|
this.localpc.addTransceiver('audio', AudioTransceiverInit)
|
this.localpc.addTransceiver('video', VideoTransceiverInit)
|
let that = this
|
this.localpc.ontrack = function (e) {
|
if (!that.localpc.stream) {
|
that.localpc.streamId = e.track.id
|
that.localpc.stream = new MediaStream()
|
that.ele.srcObject = that.localpc.stream
|
that.ele.muted = true
|
that.ele.autoplay = true
|
}
|
that.localpc.stream.addTrack(e.track)
|
}
|
|
this.localpc.createOffer()
|
.then(offer => this.localpc.setLocalDescription(offer))
|
.then(() => {
|
that.getSdp(url, this.localpc.localDescription.sdp, function (data) {
|
data = JSON.parse(data)
|
if (data.code != 0) return
|
let anwser = {}
|
anwser.sdp = data.sdp
|
anwser.type = 'answer'
|
that.localpc.setRemoteDescription(anwser).then(() => {
|
console.log("播放成功")
|
}).catch(e => {
|
console.error("播放错误:" + e)
|
})
|
})
|
})
|
.catch(e => "添加ICE候选人过程错误: " + e)
|
}
|
Close () {
|
if (this.localpc) {
|
this.localpc.close()
|
this.localpc = null
|
}
|
}
|
getSdp (url, body, success) {
|
let xhr = new XMLHttpRequest()
|
xhr.open('POST', url)
|
xhr.setRequestHeader('Content-Type', 'text/plain;charset=utf-8')
|
xhr.onreadystatechange = function () {
|
if (xhr.responseText.length < 1) return
|
if (xhr.status === 200) {
|
success(xhr.responseText)
|
}
|
}
|
xhr.send(body)
|
}
|
}
|