//index.js //获取应用实例 const app = getApp(); const utils = require("../../../utils/utils.js"); const recorderManager = wx.getRecorderManager(); const options = { duration: 60000, //指定录音的时长,单位 ms,最大为10分钟(600000),默认为1分钟(60000) sampleRate: 16000, //采样率 numberOfChannels: 1, //录音通道数 format: 'mp3', //音频格式,有效值 aac/mp3 } var livePlayerContext; Page({ data: { scene: 1001, accessToken: '', deviceSerial: '', channelNo: '1', list: [ { id: 'ptz', name: '云台控制', status: -1, normalPath: './images/ptz.png', disablePath: './images/ptz_disable.png', activePath:'./images/ptz.png', }, { id: 'voice', name: '语音播报', status: -1, normalPath: './images/voice.png', disablePath: './images/voice_disable.png', // activePath: './images/voice_active.png', activePath: './images/voice.gif', }, { id: 'mirror', name: '镜像翻转', status: -1, normalPath: './images/fanzhuan.png', disablePath: './images/fanzhuan_disable.png', activePath: './images/fanzhuan.png', }, { id: 'cover', name: '镜头遮蔽', status: -1, normalPath: './images/yinsi.png', disablePath: './images/yinsi_disable.png', activePath: './images/yinsi_active.png', }, ], videoSrc:"", videoHDSrc: "", panelStatus: 0, //0: 展示面板 1:进入云台 2-进入语音播报 3-进入镜像翻转 4-进入镜头遮蔽, ptzDisabled: true, voiceDiasbled: true, mirrorDisabled: true, mirrorInterval: false, coverDisabled: true, coverInterval: false, showVideoControls: true, autoHideTimer: undefined, videoLoadingStatus: 0, playVideo: false, videoNetWorkError: false, objectFit:'contain', openSound: true, isHD: false, showHDSelect: false, fullScreen: false, ptzStatus: 0, //0-初始化 1-top noraml 2-downnoraml 3-left normal 4-right normal 5-top noraml 6-down limit 7-left limit 8-right limit ptzLoading: false, ptzLimit: '', deviceOffline: false, deviceOfflineTime: new Date(), deviceName: '', currentPtzImg: './images/yuntai/normal.png', // 语音播报 activeDefaultVoiceName: '', activeCustomVoiceName: '', defaultVoiceList: [], // 默认语音列表 defaultVoiceTotal: 0, // 默认语音总数 defaultVoicePage: 0, // 默认语言当前页 defaultVoiceListLoading: false, defaultVoiceNoMore: false, customVoiceList: [], // 默认语音列表 customVoiceTotal: 0, // 默认语音总数 customVoicePage: 0, // 默认语言当前页 customVoiceListLoading: false, customVoiceListNoMore: false, recoderTime:60, recoderTimer: undefined, sendingOnceVoice: false, dialogTitle: '', dialogContent: '', buttons: [{text: '知道了'}], dialogShow: false, pathParam: '', imgUrl:'./images' }, onLaunch(){ console.log(onLaunch); }, onShow () { console.log("show"); var launchOptions = wx.getLaunchOptionsSync(); const pathParam = launchOptions.query.scene; console.log('pathParam:',pathParam); this.setData({ pathParam: pathParam }); if (pathParam) { this.getWxaInfo(); } // Do something when show. this.checkNetWork(); }, onHide () { // Do something when hide. console.log("hide") this.setData({ panelStatus:0, }) }, onError (msg) { console.log(msg) }, onLoad(query){ var launchOptions = wx.getLaunchOptionsSync(); const { accessToken, deviceSerial,channelNo,scene } = query; console.log("scene",scene) this.setData({ scene: parseInt(scene,10) || launchOptions.scene, accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, panelStatus:0, }); if (accessToken) { this.getPlayUrl(); this.getDeviceInfo(); this.getDeviceCoverInfo(); } this.setData({ showOneButtonDialog: true }); // 录音模块 recorderManager.onStart(() => { console.log('recorder start'); }) recorderManager.onPause(() => { console.log('recorder pause'); this.speakEnd(); }) recorderManager.onInterruptionBegin(this.speakEnd); recorderManager.onStop((res) => { console.log('recorder stop', res) const { recoderTime } = this.data; const { tempFilePath } = res; if(recoderTime >= 59) { this.setData({ recoderTime: 60, }) clearTimeout(this.data.recoderTimer); return false; } this.setData({ sendingOnceVoice: true, }) wx.uploadFile({ url: 'https://open.ys7.com/api/lapp/voice/sendonce', //仅为示例,非真实的接口地址 filePath: tempFilePath, //tempFilePaths[0], name: 'voiceFile', formData: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, }, header: { 'content-type': 'amultipart/form-data' // 默认值 }, success: (res)=> { let data = res.data; if(!data.code){ data = JSON.parse(data); } if(data.code == 200) { console.log("发送成功"); }else if(data.code =='111012') { // 设备正忙 wx.showToast({ title: '操作中,请稍后再试', icon:'none', }) }else if(data.code =='20007') { // 设备正忙 wx.showToast({ title: '设备不在线', icon:'none', }) }else if(data.code =='20008') { // 设备正忙 wx.showToast({ title: '设备响应超时', icon:'none', }) }else { wx.showToast({ title: data.msg, icon: 'none', }) } this.setData({ recoderTime: 60, }) //do something }, fail: (res)=>{ wx.showToast({ title: '网络异常', icon: 'none' }) }, complete: ()=>{ this.setData({ sendingOnceVoice: false, }) } }) }) recorderManager.onFrameRecorded((res) => { const { frameBuffer } = res console.log('frameBuffer.byteLength', frameBuffer.byteLength) }); //视频 livePlayerContext = wx.createLivePlayerContext('livePlayer'); console.log("livePlayerContext", livePlayerContext); }, checkNetWork(){ const _this = this; wx.getNetworkType({ success (res) { const networkType = res.networkType if(!networkType || networkType === 'none'){ wx.showToast({ title: '当前网络异常', icon: 'none', duration: 2000, }) } } }) }, getPlayUrl(){ const { accessToken, deviceSerial, channelNo } = this.data; var _this = this; // wx.request({ // url: 'https://open.ys7.com/api/lapp/live/address/get', //仅为示例,并非真实的接口地址 // method: 'POST', // data: { // accessToken: accessToken, // source: deviceSerial + ':' + channelNo, // }, // header: { // 'content-type': 'application/x-www-form-urlencoded' // 默认值 // }, // success: (res) => { // console.log(res.data); // const { list } = this.data; // if(res.data.code ==200 && res.data.data && res.data.data.length>0){ // var result = res.data.data[0]; // if(result.ret == 200){ // _this.setData({ // videoSrc: result.rtmp, // videoHDSrc: result.rtmpHd, // }) // }else { // list[0].status = -1; // list[1].status = -1; // list[2].status = -1; // list[3].status = -1; // _this.setData({ // list:list, // dialogTitle: '获取播放地址失败', // dialogContent: result.desc, // dialogShow: true, // showVideoControls: false, // }) // } // }else { // _this.openPlayUrl(); // } // } // }); wx.request({ url: 'https://open.ys7.com/api/lapp/v2/live/address/get', //仅为示例,并非真实的接口地址 method: 'POST', data: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, expireTime: 86400, quality: 1, protocol: 3, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success: (res) => { const { list } = this.data; if(res.data.code ==200 && res.data.data && res.data.data.url){ var result = res.data; if(result.code == 200){ _this.setData({ videoSrc: result.data.url, // videoHDSrc: result.rtmpHd, }) } else { list[0].status = -1; list[1].status = -1; list[2].status = -1; list[3].status = -1; _this.setData({ list:list, dialogContent: result.msg, showVideoControls: false, }) } } else if (res.data.code == "20001" ||res.data.code == "20002" || res.data.code == '20018'|| res.data.code == '10001'){ // 设备不存在 / 不属于用户 this.setData({ dialogTitle: '获取播放地址失败', dialogContent: '该用户不拥有该设备', dialogShow: true, }) }else { console.log("获取播放地址失败") // _this.openPlayUrl(); } } }); wx.request({ url: 'https://open.ys7.com/api/lapp/v2/live/address/get', //仅为示例,并非真实的接口地址 method: 'POST', data: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, expireTime: 86400, quality: 1, protocol: 3, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success: (res) => { console.log(res.data); const { list } = this.data; if(res.data.code ==200 && res.data.data && res.data.data.url){ var result = res.data; if(result.code == 200){ _this.setData({ //videoSrc: result.rtmp, videoHDSrc: result.data.url, }) }else { list[0].status = -1; list[1].status = -1; list[2].status = -1; list[3].status = -1; _this.setData({ list:list, dialogContent: result.msg, showVideoControls: false, }) } }else { console.log("获取高清播放地址失败") // _this.openPlayUrl(); } } }) }, /* * 获取设备基本信息 */ getDeviceCoverInfo(){ const { accessToken, deviceSerial, channelNo } = this.data; console.log(accessToken,deviceSerial,channelNo); var _this = this; wx.request({ url: 'https://open.ys7.com/api/lapp/device/scene/switch/status', method: 'POST', data: { accessToken, deviceSerial, channelNo, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res) =>{ console.log(res.data); if(res.data.code ==200 && res.data.data){ const result = res.data.data; let list = this.data.list; if(result.enable == 1){ // 当前镜头遮蔽中 list[0].status = -1; list[1].status = -1; list[2].status = -1; list[3].status = 1; this.setData({ videoNetWorkError: false, showVideoControls: false, panelStatus: 4, videoLoadingStatus: 100, list: list, }) console.log("panelStatus",this.data.panelStatus) } } }, error:(err)=>{ console.log(err); }, }) }, /* * 获取设备基本信息 */ getDeviceInfo(){ const { accessToken, deviceSerial, channelNo ,showVideoControls, videoNetWorkError,videoLoadingStatus } = this.data; var _this = this; wx.request({ url: 'https://open.ys7.com/api/lapp/device/info', //仅为示例,并非真实的接口地址 method: 'POST', data: { accessToken, deviceSerial, channelNo, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res) =>{ console.log(res.data); if(res.data.code ==200 && res.data.data){ let list = this.data.list; var result = res.data.data; _this.setData({ deviceName: result.deviceName, deviceOffline: result.status !== 1, videoNetWorkError: result.status !==1 ? false : videoNetWorkError, showVideoControls: result.status !==1 ? false : showVideoControls, deviceOfflineTime: utils.DateFormat(new Date(result.updateTime),'yyyy-MM-dd hh:mm:ss'), deviceIsEncrypt: result.isEncrypt, videoLoadingStatus: (result.isEncrypt === 1 || result.status !== 1) ? 100 : videoLoadingStatus, }); // 配置标题 if(result.deviceName){ wx.setNavigationBarTitle({ title: result.deviceName, }) } if(result.status != 1 ){ // 设备不在线 list[0].status = -1; list[1].status = -1; list[2].status = -1; list[3].status = -1; _this.setData({ list:list, showVideoControls: false }) }else if(result.isEncrypt == 1 ){ // 设备被加密 list[0].status = -1; list[1].status = -1; list[2].status = -1; list[3].status = -1; _this.setData({ list:list, dialogTitle: '设备被加密', dialogContent: '设备已被加密,无法继续查看,请前往萤石云app解密。', dialogShow: true, showVideoControls: false, }) } else { // 获取设备能力 // _this.getDeviceCapacity(); _this.getDeviceCoverInfo(); } } else if (res.data.code == "20001" ||res.data.code == "20002" || res.data.code == '20018'){ // 设备不存在 / 不属于用户 this.setData({ dialogTitle: '获取播放地址失败', dialogContent: '该用户不拥有该设备', dialogShow: true, }) }else if(res.data.code == 10029){ wx.showToast({ title: '个人版接口调用超限,请升级企业版', icon: 'none', }) }else if(res.data.code == 10002){ wx.showToast({ title: res.data.msg, icon: 'none', }) setTimeout(()=>{ this.pageBack(); },2000) }else { wx.showToast({ title: res.data.msg, icon: 'none' }) } } }) }, /* * 获取设备能力集 */ getDeviceCapacity(){ const { accessToken,deviceSerial,channelNo,playVideo} = this.data; var _this = this; wx.request({ url: 'https://open.ys7.com/api/lapp/device/capacity', method: 'POST', data: { accessToken, deviceSerial, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res) =>{ console.log(res.data); if(res.data.code ==200 && res.data.data){ var result = res.data.data; let list = this.data.list; list[0].status = result.support_ptz == 0 ? -1 : 0; list[1].status = result.support_talk != 1 ? -1 : 0; list[2].status = result.ptz_top_bottom_mirror == 0 ? -1 : 0; list[3].status = result.support_privacy == 0 ? -1 : 0; if(!playVideo){ // 非视频播放成功状态下 list[0].status = -1; list[2].status = -1; } _this.setData({ list: list, }) } else if (res.data.code == "20002" || res.data.code == '20018'){ // 设备不存在 / 不属于用户 this.setData({ dialogTitle: '设备被删除', dialogContent: '设备已从账号下删除,无法继续查看', dialogShow: true, }) } } }) }, fullScreen(){ var _this = this; livePlayerContext.requestFullScreen({ direction: 90, success: function(){ _this.setData({ fullScreen: true, }) } }); console.log("开启全屏"); }, unfullScreen() { var _this = this; livePlayerContext.exitFullScreen({ success: function(){ _this.setData({ fullScreen: false, }) } }); console.log("开启全屏"); }, ToggleObjectFit(){ var objectFit = this.data.objectFit; this.setData({ objectFit: objectFit === 'contain' ? 'fillCrop': 'contain', }) }, fullscreenChange(event){ console.log("监听到全屏变化", event) }, getDefaultVoice: function () { const { accessToken } = this.data; var _this = this; console.info("默认语音: 第" + _this.data.defaultVoicePage + "页"); var _this = this; _this.setData({ defaultVoiceListLoading: true, }) wx.request({ url: 'https://open.ys7.com/api/lapp/voice/query', //仅为示例,并非真实的接口地址 method: 'POST', data: { "accessToken": accessToken, "default": "true", "pageStart": _this.data.defaultVoicePage, "pageSize": 5, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success(res) { console.log(res.data); var defaultVoiceList = _this.data.defaultVoiceList; defaultVoiceList = defaultVoiceList.concat(res.data.data); if(res.data.data && res.data.data.length>0){ _this.setData({ defaultVoiceList: defaultVoiceList, defaultVoicePage: _this.data.defaultVoicePage + 1, }); }else { _this.setData({ defaultVoiceNoMore: true, }); } _this.setData({ defaultVoiceListLoading: false, }) }, error(error){ console.log(error); _this.setData({ defaultVoiceListLoading: false, }) } }) }, getCustomVoice: function () { const { accessToken } = this.data; var _this = this; console.info("用户自定义语音: 第" + _this.data.defaultVoicePage + "页"); var _this = this; _this.setData({ customVoiceListLoading: true, }) wx.request({ url: 'https://open.ys7.com/api/lapp/voice/query', //仅为示例,并非真实的接口地址 method: 'POST', data: { "accessToken": accessToken, default:false, "pageStart": _this.data.defaultVoicePage, "pageSize": 5, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success(res) { console.log(res.data); var customVoiceList = _this.data.customVoiceList; customVoiceList = customVoiceList.concat(res.data.data); if(res.data.data && res.data.data.length>0){ _this.setData({ customVoiceList: customVoiceList, customVoicePage: _this.data.customVoicePage + 1, }); }else { _this.setData({ customVoiceNoMore: true, }); } _this.setData({ customVoiceListLoading: false, }) }, error(error){ console.log(error); _this.setData({ customVoiceListLoading: false, }) } }) }, // 滚动至低端事件 defaultScrollLower: function () { var _this = this; console.info("defaultScrollLower 第" + _this.data.defaultVoicePage + "页"); this.getDefaultVoice(); }, // 滚动至低端事件 customScrollLower: function () { var _this = this; console.info("customScrollLower 第" + _this.data.defaultVoicePage + "页"); this.getCustomVoice(); }, handlePlay(callback){ console.log("handelPlay",this.data.playVideo,this.data.isHD); this.checkNetWork() livePlayerContext.play({ success: ()=>{ this.setData({ // playVideo: true, showVideoControls: true, // videoLoadingStatus: 100, videoNetWorkError: false, }); if(callback && typeof callback === "function"){ callback(); } }, fail: (error)=>{ this.checkNetWork(); wx.showToast({ title: '网络异常', icon:'none', }) console.log("开始播放失败"); this.setData({ videoNetWorkError: true, showVideoControls: false, videoLoadingStatus: 100, }) } }) }, handleStop(callback){ console.log("stop"); const { list } = this.data; livePlayerContext.stop({ success: ()=>{ list[0].status = -1; // list[1].status = -1; // list[2].status = -1; // list[3].status = -1; this.setData({ playVideo: false, // showVideoControls: true, videoLoadingStatus: 0, list: list, panelStatus: 0, }) if(callback && typeof callback === "function"){ callback(); } }, fail: (error)=>{ console.log("停止播放失败") } }) }, autoHideControl(){ console.log("showHdSelect",this.data.showHDSelect); const _this = this; clearTimeout(this.data.autoHideTimer); this.data.autoHideTimer = setTimeout(()=>{ const { showHDSelect } = _this.data; if(!showHDSelect){ this.setData({ showVideoControls: false, }) } },5000); }, handleSound(e){ var openSound = this.data.openSound; this.setData({ openSound: !openSound, }) }, handleHD(e){ var showHDSelect = this.data.showHDSelect; console.log("handleHD",showHDSelect) this.setData({ showHDSelect: !showHDSelect, }); }, changeVideoHD(e){ var _this = this; this.setData({ showHDSelect: false, isHD: true }); this.handleStop(_this.handlePlay); }, changeVideoNormal(e) { this.setData({ showHDSelect: false, isHD: false }) this.handleStop(this.handlePlay); }, statechange(e) { console.log('live-player code:', e.detail.code,e.detail); const { code } = e.detail; let { videoLoadingStatus,list,panelStatus } = this.data; switch (code){ case 2007: //启动loading videoLoadingStatus = 0; this.setData({ playVideo: true, videoLoadingStatus: 0, }) break; case 2001: //连接服务器 videoLoadingStatus = 20 + Math.floor(Math.random()*10+1); break; case 2002: //已经连接 RTMP 服务器,开始拉流 videoLoadingStatus = 40 + Math.floor(Math.random()*10+1); break; case 2008: // 解码器启动 break; case 2009: //视频分辨率改动 break; case 2004: // 视频播放开始 videoLoadingStatus = 80 + Math.floor(Math.random()*10+1); break; case 2003: //网络接收到首个视频数据包(IDR) videoLoadingStatus = 100; this.setData({ playVideo: true, }) this.autoHideControl(); this.getDeviceCapacity(); break; case 2103: //网络断连, 已启动自动重连(本小程序不自动重连) // videoLoadingStatus = 100; // this.handleStop(); // 获取设备状态 // this.getDeviceInfo(); break; case 3001: case 3002: case 3003: case 3005: // 播放失败 videoLoadingStatus = 100; // this.getDeviceInfo(); this.checkNetWork(); this.handleStop(this.playError); list[2].status = -1; this.setData({ // playVideo: false, showVideoControls: false, videoNetWorkError: true, videoLoadingStatus: 100, list: list, }) break; case -2301: // 经多次重连抢救无效,更多重试请自行重启播放 videoLoadingStatus = 100; this.setData({ // playVideo: false, showVideoControls: false, videoNetWorkError: true, videoLoadingStatus: 100, }) break; } this.setData({ videoLoadingStatus: videoLoadingStatus }) }, playError(){ this.setData({ showVideoControls: false, videoNetWorkError: true, videoLoadingStatus: 100, }); // this.getPlayUrl(); this.getDeviceInfo(); this.getDeviceCoverInfo(); }, error(e) { console.log('live-player',e); console.error('live-player error:', e.detail) if(e.detail.errCode == 10001){ wx.showToast({ title: '视频直播对讲需要你手机授权微信录音或麦克风权限', icon:'none', duration:3000, }) } }, onVideoTap(e){ console.log("点击视频"); const { deviceOffline,showVideoControls,panelStatus,videoNetWorkError} = this.data; if(deviceOffline || panelStatus === 4 || videoNetWorkError){ return false; } if(showVideoControls){ this.setData({ showVideoControls: false, }); clearTimeout(this.data.autoHideTimer); }else { this.setData({ showVideoControls: true, }) this.autoHideControl(); } }, tapPanel: function(event) { const { accessToken, deviceSerial, channelNo } = this.data; var tValue = event.currentTarget.dataset.value; var list = this.data.list; var panelStatus = this.data.panelStatus; switch (tValue) { case 'ptz': if(list[0].status === -1){ return false; } panelStatus = 1; // list[0].status = 1; // list[1].status = 0; // list[2].status = 0; // list[3].status = 0; break; case 'voice': if(list[1].status === -1) { return false; } panelStatus = 2; this.getDefaultVoice(); this.getCustomVoice(); break; case 'mirror': if(list[2].status === -1){ return false; } if(panelStatus === 3){ panelStatus = 0; // list[0].status = 0; // list[1].status = 0; list[2].status = 0; // list[3].status = 0; this.sceneMirror(2); }else{ panelStatus = 3; // list[0].status = 0; // list[1].status = 0; // list[2].status = 1; // list[3].status = 0; this.sceneMirror(2); } break; case 'cover': if(list[3].status === -1){ return false; } if (panelStatus === 4){ // 镜头遮蔽中 // panelStatus = 0; // list[0].status = 0; // list[1].status = 0; // list[2].status = 0; // list[3].status = 0; // this.getDeviceCapacity(); this.sceneCover(0); }else{ // panelStatus = 4; // list[0].status = 0; // list[1].status = 0; // list[2].status = 0; // list[3].status = 1; this.sceneCover(1); } break; default: panelStatus = 0; } this.setData({ panelStatus: panelStatus, list: list }) }, startRecord(e){ recorderManager.start(options) }, stopRecord(e){ recorderManager.stop() }, handleBackPanel(event){ var tValue = event.currentTarget.dataset.value; this.setData({ panelStatus:0, }) }, handlePtzTouchStart(event){ // var { offsetLeft, offsetTop } = event.currentTarget; // var {clientX,clientY} = event.touches[0]; var { ptzStatus,ptzLoading } = this.data; // var centerLeft = 104 + offsetLeft; // var centerTop = 104 + offsetTop; // var left = clientX - centerLeft; // var top = clientY - centerTop; wx.createSelectorQuery().select('#ptz-img-container').boundingClientRect( (rect) => { let { clientX,clientY} = event.touches[0]; let rectLeft = rect.left; let rectTop = rect.top; var centerLeft = 104 + rectLeft; var centerTop = 104 + rectTop; var left = clientX - centerLeft; var top = clientY - centerTop; console.log("点击了页面方位:pageY",clientY); console.log("云盘位置:top",rect.top); if(ptzLoading){ wx.showToast({ title: '操作过于频繁,建议长按转动', icon: 'none' }) return false; } if(Math.abs(left) > Math.abs(top)){ if(left>0){ this.handlePtzControl(3); ptzStatus = 4; }else { ptzStatus = 3; this.handlePtzControl(2); } } else { if (top > 0) { ptzStatus = 2; this.handlePtzControl(1); } else { ptzStatus = 1; this.handlePtzControl(0); } } this.setData({ ptzStatus: ptzStatus, }) }).exec(); }, handlePtzTouchEnd(event) { let { clientX, clientY } = event.changedTouches[0]; const _this = this; wx.createSelectorQuery().select('#ptz-img-container').boundingClientRect( (rect) => { let rectLeft = rect.left; let rectTop = rect.top; var centerLeft = 104 + rectLeft; var centerTop = 104 + rectTop; var left = clientX - centerLeft; var top = clientY - centerTop; if (Math.abs(left) > Math.abs(top)) { if (left > 0) { _this.handlePtzControl(3,'stop'); } else { _this.handlePtzControl(2, 'stop'); } } else { if (top > 0) { _this.handlePtzControl(1, 'stop'); } else { _this.handlePtzControl(0,'stop'); } } }).exec(); this.setData({ ptzStatus: 0, }) }, handlePtzControl(position,type){ const { accessToken, deviceSerial, channelNo,ptzLoading } = this.data; let ptzLimit = ''; const ptzTopImgSuccess = './images/yuntai/top.png'; const ptzTopImgFailed = './images/yuntai/top_limit.png'; const ptzDownImgSuccess = './images/yuntai/down.png'; const ptzDownImgFailed = './images/yuntai/down_limit.png'; const ptzLeftImgSuccess = './images/yuntai/left.png'; const ptzLeftImgFailed = './images/yuntai/left_limit.png'; const ptzRightImgSuccess = './images/yuntai/right.png'; const ptzRightImgFailed = './images/yuntai/right_limit.png'; const ptzNormalImg = './images/yuntai/normal.png'; let ptzStatus = this.data.ptzStatus; let currentPtzImg = this.data.currentPtzImg; var url = 'https://open.ys7.com/api/lapp/device/ptz/start'; if(type == 'stop'){ url = 'https://open.ys7.com/api/lapp/device/ptz/stop' } if(ptzLoading && type === 'start'){ wx.showToast({ title: '操作过于频繁,建议长按转动', icon: 'none' }) return false; } this.setData({ ptzLoading: true, }) wx.request({ url: url, //仅为示例,并非真实的接口地址 method: 'POST', data: { "accessToken": accessToken, "deviceSerial": deviceSerial, "channelNo": channelNo, "direction": position, speed:1, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success: (res) => { const code = res.data.code; if(code == 10029){ wx.showToast({ title: '个人版接口调用超限,请升级企业版', icon: 'none', }) }else if(code != 200){ wx.showToast({ title: res.data.msg, icon: 'none', }) } if(type == 'stop'){ ptzStatus = 0; currentPtzImg = ptzNormalImg; }else{ switch(position){ case 0: ptzStatus = 1; currentPtzImg = code == 200 ? ptzTopImgSuccess : ptzTopImgFailed; ptzLimit = code == 200 ? '' : 'top'; break; case 1: ptzStatus = 2; currentPtzImg = code == 200 ? ptzDownImgSuccess : ptzDownImgFailed; ptzLimit = code == 200 ? '' : 'down'; break; case 2: ptzStatus = 3; currentPtzImg = code == 200 ? ptzLeftImgSuccess : ptzLeftImgFailed; ptzLimit = code == 200 ? '' : 'left'; break; case 3: ptzStatus = 4; currentPtzImg = code == 200 ? ptzRightImgSuccess : ptzRightImgFailed; ptzLimit = code == 200 ? '' : 'right'; break; default: ptzStatus = 0; currentPtzImg = ptzTopImgSuccess; ptzLimit = ''; } } this.setData({ ptzStatus: ptzStatus, currentPtzImg: currentPtzImg, ptzLoading: false, ptzLimit: ptzLimit, }); }, error:(err) =>{ this.setData({ ptzLoading: false, }) } }) }, screenShoot(e){ const { playVideo,videoLoadingStatus } = this.data; if(!playVideo || videoLoadingStatus != 100){ console.log("非播放状态下点击截图"); return false; } console.log("开始截图") // livePlayerContext.snapshot('raw'); let that = this wx.getSetting({ success(res) { if (res.authSetting['scope.writePhotosAlbum']) { that.saveImg(); } else if (res.authSetting['scope.writePhotosAlbum'] === undefined) { wx.authorize({ scope: 'scope.writePhotosAlbum', success() { that.saveImg(); }, fail() { that.authConfirm() } }) } else { that.authConfirm() } } }) }, saveImg(){ livePlayerContext.snapshot('raw') .then(data =>{ console.log("data",data); if (data) { console.log(data) wx.saveImageToPhotosAlbum({ filePath: data.tempImagePath, success(res) { console.log("保存成功",res) wx.showToast({ title: '截图已保存至手机相册', icon: 'none', }) } }) } }) .catch(err => { console.log("err",err); }) }, // 授权拒绝后,再次授权提示弹窗 authConfirm(){ let that = this wx.showModal({ content: '您没打开保存图片权限,是否去设置打开?', confirmText: "确认", cancelText: "取消", success: function (res) { if (res.confirm) { wx.openSetting({ success :(res) => { if (res.authSetting['scope.writePhotosAlbum']) { that.saveImg(); } else { wx.showToast({ title: '您没有授权,无法保存到相册', icon: 'none' }) } } }) } else { wx.showToast({ title: '您没有授权,无法保存到相册', icon: 'none' }) } } }); }, // 镜头遮蔽 sceneCover(enable) { var _this = this; let { deviceSerial, channelNo,accessToken,coverInterval,list,panelStatus,videoNetWorkError } = this.data; if(coverInterval){ wx.showToast({ title: '操作过于频繁', icon: 'none' }) return false; } this.setData({ coverInterval: true, }) wx.request({ url: 'https://open.ys7.com/api/lapp/device/scene/switch/set', method: 'POST', data: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, enable: enable, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res) =>{ console.log(res.data); if(res.data.code == 200){ if(enable == 0){ list[3].status = 0; panelStatus = 0; videoNetWorkError = false; this.getDeviceCapacity(); this.handlePlay(); }else { list[0].status = -1; list[1].status = -1; list[2].status = -1; panelStatus = 4; list[3].status = 1; // this.handleStop(); } setTimeout(()=>{ this.setData({ coverInterval: false, }); },5000) this.setData({ videoNetWorkError: videoNetWorkError, list:list, panelStatus:panelStatus }) }else { wx.showToast({ title: res.data.msg, icon: 'none', }) this.setData({ coverInterval: false, panelStatus: panelStatus, }); } }, fail: (res)=>{ wx.showToast({ title: '网络异常', icon: 'none' }) this.setData({ coverInterval: false, }); } }); }, // 镜象翻转 sceneMirror(enable) { const { deviceSerial, channelNo,accessToken,mirrorInterval } = this.data; var _this = this; if(mirrorInterval) { wx.showToast({ title: '操作过于频繁', icon: 'none' }) return false; } this.setData({ mirrorInterval: true, }); wx.request({ url: 'https://open.ys7.com/api/lapp/device/ptz/mirror', //仅为示例,并非真实的接口地址 method: 'POST', data: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, command: enable, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res) => { console.log(res.data); if(res.data.code == 200){ setTimeout(()=>{ this.setData({ mirrorInterval: false, }); },5000) }else { wx.showToast({ title: res.data.msg, icon: 'none' }) this.setData({ mirrorInterval: false, }); } }, fail: (res)=>{ wx.showToast({ title: '网络异常', icon: 'none' }) this.setData({ mirrorInterval: false, }); } }) }, playVoice(event){ const { accessToken, deviceSerial, channelNo } = this.data; var { duration, voiceName,fileUrl } = event.currentTarget.dataset.value; var type = event.currentTarget.dataset.type; console.log("type",type) wx.request({ url: 'https://open.ys7.com/api/lapp/voice/send', //仅为示例,并非真实的接口地址 method: 'POST', data: { accessToken: accessToken, deviceSerial: deviceSerial, channelNo: channelNo, fileUrl: fileUrl, }, header: { 'content-type': 'application/x-www-form-urlencoded' // 默认值 }, success:(res)=> { console.log(res.data); const { list } = this.data; if(res.data.code == 200){ list[1].status = 1; this.setData({ activeCustomVoiceName: type === 'custom' ? voiceName : '', activeDefaultVoiceName: type === 'default' ? voiceName : '', list: list, }); setTimeout(()=>{ list[1].status = 0; this.setData({ activeCustomVoiceName: '', activeDefaultVoiceName: '', list: list, }) },duration * 1000) }else if(res.data.code =='111012') { // 设备正忙 wx.showToast({ title: '操作中,请稍后再试', icon:'none', }) }else if(res.data.code =='20007') { // 设备正忙 wx.showToast({ title: '设备不在线', icon:'none', }) }else if(res.data.code =='20008') { // 设备正忙 wx.showToast({ title: '设备响应超时', icon:'none', }) }else { wx.showToast({ title: res.data.msg, icon:'none', }) } }, fail: (res)=>{ wx.showToast({ title: '网络异常', icon: 'none' }) } }) }, speakStart(event){ let recoderTime = this.data.recoderTime; this.setData({ recoderTime: 59, }) recorderManager.start(options); wx.showToast({ icon: 'none', duration: 60000, image: './images/voice_talk4.png', title: '剩余' + recoderTime }); this.data.recoderTimer = setInterval(()=>{ // _this.setData({ // recoderTime: --recoderTime // },1000) if(recoderTime > 0){ --recoderTime; wx.showToast({ icon: 'none', duration: 60000, image: './images/voice_talk4.png', title: '剩余' + recoderTime }); this.setData({ recoderTime: recoderTime }) }else { clearInterval(this.data.recoderTimer); this.speakEnd(); } // console.log("recoderTime", recoderTime) },1000) }, speakEnd(event) { wx.hideToast(); let recoderTime = this.data.recoderTime; if(recoderTime >= 59){ wx.showToast({ title: '时间太短了', icon:'none', }) recorderManager.stop(); clearInterval(this.data.recoderTimer); return false; }else { wx.hideToast(); recorderManager.stop(); clearInterval(this.data.recoderTimer); } }, tapDialogButton(e) { this.setData({ dialogShow: false }); this.pageBack(); }, pageBack() { const { scene } = this.data; console.log("scene",scene); // wx.showToast({ // title: `code ${scene}`, // }) if([1007,1008,1036,1037,1038,1044].indexOf(scene) === -1){ wx.navigateBack({ delta: 1 }) } else { wx.reLaunch({ url: '/pages/home/home', }) } }, /** * 用户点击右上角分享 */ onShareAppMessage: function(res) { const { accessToken, deviceSerial, channelNo } = this.data; if (res.from === 'button') { // 来自页面内转发按钮 console.log(res.target); this.setData({ panelStatus: 0, }) } return { title: '小程序', path: '/pages/live/live?accessToken=' + accessToken + '&deviceSerial='+ deviceSerial + '&channelNo=' + channelNo + '&scene=1007', } }, })