/** * 播放视频流,需要先在HTML里面引入kurento-client.min.js和kurento-utils.min.js * @param container 播放视频的HTML元素 * @param rtspUrl rtsp流地址 * @param serverUrl 后台服务地址 * @param spinningImg 加载中的动画 */ let cofVideo = function (container, { rtspUrl, serverUrl, spinningImg }) { this.args = getopts(location.search, { ws_uri: serverUrl, ice_servers: undefined }) this.spinningImg = spinningImg let options = { remoteVideo: container } this.container = container this.showSpinner() this.rtsp = rtspUrl this.webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, (error) => { if (error) return console.error(error) this.webRtcPeer.generateOffer(this.onOffer) this.webRtcPeer.peerConnection.addEventListener('iceconnectionstatechange', (event) => { if (this.webRtcPeer && this.webRtcPeer.peerConnection) { // console.log('oniceconnectionstatechange -> ' + this.webRtcPeer.peerConnection.iceConnectionState) // console.log('icegatheringstate -> ' + this.webRtcPeer.peerConnection.iceGatheringState) } }) }) that = this } cofVideo.prototype = { showSpinner: function () { this.container.style.background = `center transparent url(${this.spinningImg}) no-repeat` }, hideSpinner: function () { this.container.style.background = '' }, onOffer: function (error, sdpOffer) { if (error) throw onError(error) kurentoClient(that.args.ws_uri, (error, kurentoClient) => { if (error) return onError(error) that.kC = kurentoClient kurentoClient.create('MediaPipeline', (error, p) => { if (error) return onError(error) that.pipeline = p that.pipeline.create('PlayerEndpoint', { networkCache: 0, uri: that.rtsp }, (error, player) => { if (error) return onError(error) that.pipeline.create('WebRtcEndpoint', (error, webRtcEndpoint) => { if (error) return onError(error) setIceCandidateCallbacks(webRtcEndpoint, that.webRtcPeer, onError) webRtcEndpoint.processOffer(sdpOffer, (error, sdpAnswer) => { if (error) return onError(error) webRtcEndpoint.gatherCandidates(onError) that.webRtcPeer.processAnswer(sdpAnswer) }) player.connect(webRtcEndpoint, function (error) { if (error) return onError(error) // console.log('PlayerEndpoint-->WebRtcEndpoint connection established') player.play((error) => { if (error) return onError(error) // console.log('Player playing ...') }) that.hideSpinner() // 播放后隐藏loading }) }) }) }) }) }, onError: function (error) { if (error) console.error(error) }, destroy () { if (this.webRtcPeer) { this.webRtcPeer.dispose() this.webRtcPeer = null } if (that.pipeline) { that.pipeline.endTransaction() that.pipeline.release() that.pipeline = null } if(that.kC){ that.kC.close() } that = null this.hideSpinner() } } export default cofVideo function onError (error) { if (error) console.error(error) } function getopts (args, opts) { var result = opts || {} args.replace( new RegExp('([^?=&]+)(=([^&]*))?', 'g'), function ($0, $1, $2, $3) { result[$1] = $3 } ) return result } function setIceCandidateCallbacks (webRtcEndpoint, webRtcPeer, onError) { webRtcPeer.on('icecandidate', (candidate) => { // console.log('Local icecandidate ' + JSON.stringify(candidate)) candidate = kurentoClient.register.complexTypes.IceCandidate(candidate) webRtcEndpoint.addIceCandidate(candidate, onError) }) webRtcEndpoint.on('OnIceCandidate', (event) => { var candidate = event.candidate // console.log('Remote icecandidate ' + JSON.stringify(candidate)) webRtcPeer.addIceCandidate(candidate, onError) }) }