web_src/src/components/dialog/devicePlayer.vue
old mode 100644 new mode 100755
@@ -1,13 +1,13 @@
<template>
  <div id="devicePlayer" v-loading="isLoging">
    <el-dialog title="视频播放" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" @close="close()">
    <el-dialog title="视频播放" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" @close="close()" v-if="showVideoDialog">
      <div style="width: 100%; height: 100%">
        <el-tabs type="card" :stretch="true" v-model="activePlayer" @tab-click="changePlayer"
                 v-if="Object.keys(this.player).length > 1">
          <el-tab-pane label="Jessibuca" name="jessibuca">
            <jessibucaPlayer v-if="activePlayer === 'jessibuca'" ref="jessibuca" :visible.sync="showVideoDialog"
                             :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px"
                             :videoUrl="videoUrl" :error="videoError" :message="videoError" style="height: 515px"
                             :hasAudio="hasAudio" fluent autoplay live></jessibucaPlayer>
          </el-tab-pane>
          <el-tab-pane label="WebRTC" name="webRTC">
@@ -16,7 +16,6 @@
                        :hasAudio="hasAudio" fluent autoplay live></rtc-player>
          </el-tab-pane>
          <el-tab-pane label="h265web">h265web敬请期待</el-tab-pane>
          <el-tab-pane label="wsPlayer">wsPlayer 敬请期待</el-tab-pane>
        </el-tabs>
        <jessibucaPlayer v-if="Object.keys(this.player).length == 1 && this.player.jessibuca" ref="jessibuca"
                         :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError"
@@ -181,7 +180,7 @@
                                                     style="font-size: 1.875rem;"></i></div>
                <div style="position: absolute; left: 7.25rem; top: 3.25rem; font-size: 1.875rem;"
                     @mousedown="ptzCamera('zoomout')" @mouseup="ptzCamera('stop')"><i
                  class="el-icon-zoom-out control-zoom-btn"></i></div>
                    class="el-icon-zoom-out control-zoom-btn"></i></div>
                <div class="contro-speed" style="position: absolute; left: 4px; top: 7rem; width: 9rem;">
                  <el-slider v-model="controSpeed" :max="255"></el-slider>
                </div>
@@ -300,8 +299,9 @@
          </el-tab-pane>
          <el-tab-pane label="语音对讲" name="broadcast">
            <div style="padding: 0 10px">
              <el-switch v-model="broadcastMode" :disabled="broadcastStatus !== -1" active-color="#409EFF" active-text="喊话"
                         inactive-text="对讲"></el-switch>
              <el-switch v-model="broadcastMode" :disabled="broadcastStatus !== -1" active-color="#409EFF"
                         active-text="喊话(Broadcast)"
                         inactive-text="对讲(Talk)"></el-switch>
            </div>
            <div class="trank" style="text-align: center;">
              <el-button @click="broadcastStatusClick()" :type="getBroadcastStatus()" :disabled="broadcastStatus === -2"
@@ -539,25 +539,31 @@
      // if (callback )callback();
    },
    playFromStreamInfo: function (realHasAudio, streamInfo) {
      this.showVideoDialog = true;
      this.hasaudio = realHasAudio && this.hasaudio;
      this.$refs[this.activePlayer].play(this.getUrlByStreamInfo(streamInfo))
    },
    close: function () {
      console.log('关闭视频');
      if (!!this.$refs[this.activePlayer]) {
        this.$refs[this.activePlayer].pause();
      }
      this.videoUrl = '';
      this.coverPlaying = false;
      this.showVideoDialog = false;
      if (this.convertKey != '') {
        this.convertStop();
      }
      this.convertKey = ''
      this.stopBroadcast()
    },
        playFromStreamInfo: function (realHasAudio, streamInfo) {
          this.showVideoDialog = true;
          this.hasaudio = realHasAudio && this.hasaudio;
          if (this.$refs[this.activePlayer]) {
            this.$refs[this.activePlayer].play(this.getUrlByStreamInfo(streamInfo))
          }else {
            this.$nextTick(() => {
              this.$refs[this.activePlayer].play(this.getUrlByStreamInfo(streamInfo))
            });
          }
        },
        close: function () {
            console.log('关闭视频');
            if (!!this.$refs[this.activePlayer]){
              this.$refs[this.activePlayer].pause();
            }
            this.videoUrl = '';
            this.coverPlaying = false;
            this.showVideoDialog = false;
            if (this.convertKey != '') {
              this.convertStop();
            }
            this.convertKey = ''
            this.stopBroadcast()
        },
    copySharedInfo: function (data) {
      console.log('复制内容:' + data);
@@ -565,20 +571,20 @@
      this.tracks = []
      let _this = this;
      this.$copyText(data).then(
        function (e) {
          _this.$message({
            showClose: true,
            message: '复制成功',
            type: 'success'
          });
        },
        function (e) {
          _this.$message({
            showClose: true,
            message: '复制失败,请手动复制',
            type: 'error'
          });
        }
          function (e) {
            _this.$message({
              showClose: true,
              message: '复制成功',
              type: 'success'
            });
          },
          function (e) {
            _this.$message({
              showClose: true,
              message: '复制失败,请手动复制',
              type: 'error'
            });
          }
      );
    },
    ptzCamera: function (command) {
@@ -654,55 +660,54 @@
        this.$axios({
          method: 'get',
          url: '/api/play/broadcast/' + this.deviceId + '/' + this.channelId + "?timeout=30&broadcastMode=" + this.broadcastMode
        }).then( (res)=> {
          if (res.data.code == 0) {
        }).then((res) => {
          if (res.data.code === 0) {
            let streamInfo = res.data.data.streamInfo;
            if (document.location.protocol.includes("https")) {
              this.startBroadcast(streamInfo.rtcs)
            }else {
            } else {
              this.startBroadcast(streamInfo.rtc)
            }
                }else {
                  this.$message({
                    showClose: true,
                    message: res.data.msg,
                    type: "error",
                  });
                }
              });
            }else if (this.broadcastStatus === 1) {
                this.broadcastStatus = -1;
                this.broadcastRtc.close()
            }
        },
        startBroadcast(url){
          // 获取推流鉴权Key
          this.$axios({
            method: 'post',
            url: '/api/user/userInfo',
          }).then( (res)=> {
            if (res.data.code !== 0) {
              this.$message({
                showClose: true,
                message: "获取推流鉴权Key失败",
                type: "error",
              });
              this.broadcastStatus = -1;
            }else {
              let pushKey = res.data.data.pushKey;
              // 获取推流鉴权KEY
              url += "&sign=" + crypto.createHash('md5').update(pushKey, "utf8").digest('hex')
              console.log("开始语音喊话: " + url)
              this.broadcastRtc = new ZLMRTCClient.Endpoint({
                debug: true, // 是否打印日志
                zlmsdpUrl: url, //流地址
                simulecast: false,
                useCamera: false,
                audioEnable: true,
                videoEnable: false,
                recvOnly: false,
              })
          } else {
            this.$message({
              showClose: true,
              message: res.data.msg,
              type: "error",
            });
          }
        });
      } else if (this.broadcastStatus === 1) {
        this.broadcastStatus = -1;
        this.broadcastRtc.close()
      }
    },
    startBroadcast(url) {
      // 获取推流鉴权Key
      this.$axios({
        method: 'post',
        url: '/api/user/userInfo',
      }).then((res) => {
        if (res.data.code !== 0) {
          this.$message({
            showClose: true,
            message: "获取推流鉴权Key失败",
            type: "error",
          });
          this.broadcastStatus = -1;
        } else {
          let pushKey = res.data.data.pushKey;
          // 获取推流鉴权KEY
          url += "&sign=" + crypto.createHash('md5').update(pushKey, "utf8").digest('hex')
          console.log("开始语音喊话: " + url)
          this.broadcastRtc = new ZLMRTCClient.Endpoint({
            debug: true, // 是否打印日志
            zlmsdpUrl: url, //流地址
            simulecast: false,
            useCamera: false,
            audioEnable: true,
            videoEnable: false,
            recvOnly: false,
          })
          // webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//获取到了远端流,可以播放
          //   console.error('播放成功',e.streams)
@@ -715,15 +720,15 @@
          //   // this.eventcallbacK("LOCAL STREAM", "获取到了本地流")
          // });
              this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_NOT_SUPPORT,(e)=>{// 获取到了本地流
                console.error('不支持webrtc',e)
                this.$message({
                  showClose: true,
                  message: '不支持webrtc, 无法进行语音喊话',
                  type: 'error'
                });
                this.broadcastStatus = -1;
              });
          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_NOT_SUPPORT, (e) => {// 获取到了本地流
            console.error('不支持webrtc', e)
            this.$message({
              showClose: true,
              message: '不支持webrtc, 无法进行语音喊话',
              type: 'error'
            });
            this.broadcastStatus = -1;
          });
          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR, (e) => {// ICE 协商出错
            console.error('ICE 协商出错')