| | |
| | | <el-tag >RTC:</el-tag> |
| | | <span>{{ streamInfo.rtc }}</span> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item :command="streamInfo.rtcs"> |
| | | <el-tag >RTCS:</el-tag> |
| | | <span>{{ streamInfo.rtcs }}</span> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item :command="streamInfo.rtmp"> |
| | | <el-tag >RTMP:</el-tag> |
| | | <span>{{ streamInfo.rtmp }}</span> |
| | |
| | | </el-tab-pane> |
| | | <el-tab-pane label="语音对讲" name="broadcast" > |
| | | <div class="trank" style="text-align: center;"> |
| | | <el-button @click="broadcastStatusClick()" :type="getBroadcastStatus()" circle icon="el-icon-microphone" style="font-size: 32px; padding: 24px;margin-top: 24px;"/> |
| | | <el-button @click="broadcastStatusClick()" :type="getBroadcastStatus()" :disabled="broadcastStatus === -2" circle icon="el-icon-microphone" style="font-size: 32px; padding: 24px;margin-top: 24px;"/> |
| | | <p> |
| | | <span v-if="broadcastStatus === -2">正在释放资源</span> |
| | | <span v-if="broadcastStatus === -1">点击开始对讲</span> |
| | | <span v-if="broadcastStatus === 0">等待接通中...</span> |
| | | <span v-if="broadcastStatus === 1">请说话</span> |
| | |
| | | |
| | | <script> |
| | | import rtcPlayer from '../dialog/rtcPlayer.vue' |
| | | import crypto from 'crypto' |
| | | // import LivePlayer from '@liveqing/liveplayer' |
| | | // import player from '../dialog/easyPlayer.vue' |
| | | import jessibucaPlayer from '../common/jessibuca.vue' |
| | |
| | | } |
| | | }, |
| | | created() { |
| | | console.log("created") |
| | | console.log(this.player) |
| | | this.broadcastStatus = -1; |
| | | if (Object.keys(this.player).length === 1) { |
| | | this.activePlayer = Object.keys(this.player)[0] |
| | | } |
| | |
| | | // 如何你只是用一种播放器,直接注释掉不用的部分即可 |
| | | player: { |
| | | jessibuca : ["ws_flv", "wss_flv"], |
| | | webRTC: ["rtc", "rtc"], |
| | | webRTC: ["rtc", "rtcs"], |
| | | }, |
| | | videoHistory: { |
| | | date: '', |
| | |
| | | showTimeText: "00:00:00", |
| | | streamInfo: null, |
| | | broadcastRtc: null, |
| | | broadcastStatus: -1, // -1 默认状态 0 等待接通 1 接通成功 |
| | | broadcastStatus: -1, // -2 正在释放资源 -1 默认状态 0 等待接通 1 接通成功 |
| | | }; |
| | | }, |
| | | methods: { |
| | |
| | | if (tab.name === "codec") { |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtmp&app='+ this.app +'&stream='+ this.streamId |
| | | url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtsp&app='+ this.app +'&stream='+ this.streamId |
| | | }).then(function (res) { |
| | | that.tracksLoading = false; |
| | | if (res.data.code == 0 && res.data.online) { |
| | | if (res.data.code == 0 && res.data.tracks) { |
| | | that.tracks = res.data.tracks; |
| | | }else{ |
| | | that.tracksNotLoaded = true; |
| | |
| | | console.log(this.videoUrl) |
| | | }, |
| | | openDialog: function (tab, deviceId, channelId, param) { |
| | | if (this.showVideoDialog) { |
| | | return; |
| | | } |
| | | this.tabActiveName = tab; |
| | | this.channelId = channelId; |
| | | this.deviceId = deviceId; |
| | |
| | | this.playFromStreamInfo(false, streamInfo) |
| | | }, |
| | | getUrlByStreamInfo(){ |
| | | console.log(this.streamInfo) |
| | | if (location.protocol === "https:") { |
| | | this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]] |
| | | }else { |
| | |
| | | this.$refs[this.activePlayer].pause() |
| | | that.$axios({ |
| | | method: 'post', |
| | | url: '/api/gb_record/convert/' + that.streamId |
| | | url: '/api/play/convert/' + that.streamId |
| | | }).then(function (res) { |
| | | if (res.data.code == 0) { |
| | | if (res.data.code === 0) { |
| | | that.convertKey = res.data.key; |
| | | setTimeout(()=>{ |
| | | that.isLoging = false; |
| | |
| | | this.stopPlayRecord(); |
| | | } |
| | | this.recordPlay = '' |
| | | this.stopBroadcast() |
| | | }, |
| | | |
| | | copySharedInfo: function (data) { |
| | |
| | | url: '/api/gb_record/query/' + this.deviceId + '/' + this.channelId + '?startTime=' + startTime + '&endTime=' + endTime |
| | | }).then(function (res) { |
| | | console.log(res) |
| | | that.recordsLoading = false; |
| | | if(res.data.code === 0) { |
| | | // 处理时间信息 |
| | | that.videoHistory.searchHistoryResult = res.data.data.recordList; |
| | | that.recordsLoading = false; |
| | | }else { |
| | | this.$message({ |
| | | showClose: true, |
| | |
| | | url: '/api/playback/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + row.startTime + '&endTime=' + |
| | | row.endTime |
| | | }).then(function (res) { |
| | | that.streamInfo = res.data; |
| | | if (res.data.code === 0) { |
| | | that.streamInfo = res.data.data; |
| | | that.app = that.streamInfo.app; |
| | | that.streamId = that.streamInfo.stream; |
| | | that.mediaServerId = that.streamInfo.mediaServerId; |
| | | that.ssrc = that.streamInfo.ssrc; |
| | | that.videoUrl = that.getUrlByStreamInfo(); |
| | | that.recordPlay = true; |
| | | }else { |
| | | that.$message({ |
| | | showClose: true, |
| | | message: res.data.msg, |
| | | type: "error", |
| | | }); |
| | | } |
| | | that.recordPlay = true; |
| | | }); |
| | | } |
| | | }, |
| | |
| | | }); |
| | | }, |
| | | getBroadcastStatus() { |
| | | if (this.broadcastStatus == -2) { |
| | | return "primary" |
| | | } |
| | | if (this.broadcastStatus == -1) { |
| | | return "primary" |
| | | } |
| | |
| | | broadcastStatusClick() { |
| | | if (this.broadcastStatus == -1) { |
| | | // 默认状态, 开始 |
| | | this.broadcastStatus = 0 |
| | | // 发起语音对讲 |
| | | this.$axios({ |
| | | method: 'get', |
| | |
| | | }).then( (res)=> { |
| | | if (res.data.code == 0) { |
| | | let streamInfo = res.data.data.streamInfo; |
| | | this.startBroadcast(streamInfo.rtc) |
| | | if (document.location.protocol.includes("https")) { |
| | | this.startBroadcast(streamInfo.rtcs) |
| | | }else { |
| | | this.startBroadcast(streamInfo.rtc) |
| | | } |
| | | |
| | | }else { |
| | | this.$message({ |
| | | showClose: true, |
| | |
| | | } |
| | | }); |
| | | }else if (this.broadcastStatus === 1) { |
| | | this.broadcastRtc.close() |
| | | this.broadcastRtc = null; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId |
| | | }).then( (res)=> { |
| | | if (res.data.code == 0) { |
| | | let streamInfo = res.data.data.streamInfo; |
| | | this.startBroadcast(streamInfo.rtc) |
| | | }else { |
| | | this.$message({ |
| | | showClose: true, |
| | | message: res.data.msg, |
| | | type: "error", |
| | | }); |
| | | } |
| | | }); |
| | | this.broadcastStatus = -1; |
| | | this.broadcastStatus = -1; |
| | | this.broadcastRtc.close() |
| | | } |
| | | }, |
| | | startBroadcast(url){ |
| | | 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) |
| | | // this.broadcastStatus = 1; |
| | | // }); |
| | | // |
| | | // webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,(s)=>{// 获取到了本地流 |
| | | // this.broadcastStatus = 1; |
| | | // // document.getElementById('selfVideo').srcObject=s; |
| | | // // 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.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR,(e)=>{// ICE 协商出错 |
| | | console.error('ICE 协商出错') |
| | | this.$message({ |
| | | showClose: true, |
| | | message: 'ICE 协商出错', |
| | | type: 'error' |
| | | }); |
| | | }); |
| | | |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,(e)=>{// offer anwser 交换失败 |
| | | console.error('offer anwser 交换失败',e) |
| | | this.$message({ |
| | | showClose: true, |
| | | message: 'offer anwser 交换失败' + e, |
| | | type: 'error' |
| | | }); |
| | | }); |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE,(e)=>{// offer anwser 交换失败 |
| | | console.log('状态改变',e) |
| | | if (e === "failed") { |
| | | // 获取推流鉴权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 if (e === "connecting") { |
| | | this.broadcastStatus = 0; |
| | | }else{ |
| | | 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) |
| | | // this.broadcastStatus = 1; |
| | | // }); |
| | | // |
| | | // webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,(s)=>{// 获取到了本地流 |
| | | // this.broadcastStatus = 1; |
| | | // // document.getElementById('selfVideo').srcObject=s; |
| | | // // 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_ICE_CANDIDATE_ERROR,(e)=>{// ICE 协商出错 |
| | | console.error('ICE 协商出错') |
| | | this.$message({ |
| | | showClose: true, |
| | | message: 'ICE 协商出错', |
| | | type: 'error' |
| | | }); |
| | | this.broadcastStatus = -1; |
| | | }); |
| | | |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,(e)=>{// offer anwser 交换失败 |
| | | console.error('offer anwser 交换失败',e) |
| | | this.$message({ |
| | | showClose: true, |
| | | message: 'offer anwser 交换失败' + e, |
| | | type: 'error' |
| | | }); |
| | | this.broadcastStatus = -1; |
| | | }); |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE,(e)=>{// offer anwser 交换失败 |
| | | console.log('状态改变',e) |
| | | if (e === "connecting") { |
| | | this.broadcastStatus = 0; |
| | | }else if (e === "connected") { |
| | | this.broadcastStatus = 1; |
| | | }else if (e === "disconnected") { |
| | | this.broadcastStatus = -1; |
| | | } |
| | | }); |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED,(e)=>{// offer anwser 交换失败 |
| | | console.log('捕获流失败',e) |
| | | this.$message({ |
| | | showClose: true, |
| | | message: '捕获流失败' + e, |
| | | type: 'error' |
| | | }); |
| | | this.broadcastStatus = -1; |
| | | }); |
| | | } |
| | | }); |
| | | this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED,(e)=>{// offer anwser 交换失败 |
| | | console.log('捕获流失败',e) |
| | | }).catch((e) => { |
| | | this.$message({ |
| | | showClose: true, |
| | | message: '捕获流失败' + e, |
| | | message: e, |
| | | type: 'error' |
| | | }); |
| | | this.broadcastStatus = -1; |
| | | }); |
| | | |
| | | |
| | | }, |
| | | stopBroadcast(){ |
| | | this.broadcastRtc.close(); |
| | | this.broadcastStatus = -1; |
| | | this.$axios({ |
| | | method: 'get', |
| | | url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId |
| | | }).then( (res)=> { |
| | | if (res.data.code == 0) { |
| | | // this.broadcastStatus = -1; |
| | | // this.broadcastRtc.close() |
| | | }else { |
| | | this.$message({ |
| | | showClose: true, |
| | | message: res.data.msg, |
| | | type: "error", |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } |