kurentoClient

/**
 * 播放视频流,需要先在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)
  })
}

 

posted @ 2020-09-16 17:37  谢书怜  阅读(991)  评论(0编辑  收藏  举报