water_xcx/packageD/pages/video/video.js

1546 lines
44 KiB
JavaScript
Raw Normal View History

2025-04-15 15:44:51 +08:00
//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',
}
},
})