| | |
| | | return { |
| | | id: item.id, |
| | | name: item.name, |
| | | online: true, // 默认在线,实际项目中可能需要额外的状态检查 |
| | | onLine: true, // 默认在线,实际项目中可能需要额外的状态检查 |
| | | lastUpdate: new Date().toLocaleString(), // 当前时间作为最后更新时间 |
| | | isPlaying: false, // 视频播放状态 |
| | | hslUrl: rtmpUrl, // 使用生成的RTMP URL |
| | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 批量获取所有摄像头的HLS播放地址 |
| | | */ |
| | | batchGetHlsUrls(cameraList) { |
| | | if (!cameraList || cameraList.length === 0) { |
| | | console.log('摄像头列表为空,无需获取播放地址'); |
| | | return; |
| | | } |
| | | |
| | | console.log('开始批量获取播放地址,摄像头数量:', cameraList.length); |
| | | |
| | | // 为每个摄像头获取播放地址 |
| | | cameraList.forEach((camera, index) => { |
| | | // 延迟获取,避免同时发起太多请求 |
| | | setTimeout(() => { |
| | | this.getHlsUrlForCamera(camera); |
| | | }, index * 500); // 每个请求间隔500ms |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 播放视频 |
| | | */ |
| | | playVideo(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('=== 播放视频开始 ==='); |
| | | console.log('摄像头信息:', camera); |
| | | console.log('设备信息:', this.data.deviceInfo); |
| | | console.log('设备特定配置:', this.data.deviceSpecificConfig); |
| | | |
| | | if (!camera.online) { |
| | | console.log('摄像头离线,无法播放'); |
| | | wx.showToast({ |
| | | title: '设备离线,无法播放', |
| | | icon: 'error' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | if (!camera.hslUrl) { |
| | | console.log('无播放地址,无法播放'); |
| | | wx.showToast({ |
| | | title: '暂无播放地址,请稍后重试', |
| | | icon: 'error' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | if (camera.isLoadingUrl) { |
| | | console.log('正在加载URL,无法播放'); |
| | | wx.showToast({ |
| | | title: '正在获取播放地址,请稍候', |
| | | icon: 'none' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | console.log('开始播放视频,播放地址:', camera.hslUrl); |
| | | console.log('当前页面数据状态:', { |
| | | cameraList: this.data.cameraList, |
| | | activeTab: this.data.activeTab, |
| | | isLoading: this.data.isLoading |
| | | }); |
| | | |
| | | // 检查URL格式 |
| | | if (camera.hslUrl.startsWith('rtmp://')) { |
| | | console.log('检测到RTMP URL格式,开始播放'); |
| | | |
| | | // 更新播放状态 |
| | | const cameraList = this.data.cameraList.map(item => { |
| | | if (item.id === camera.id) { |
| | | return { |
| | | ...item, |
| | | isPlaying: true |
| | | }; |
| | | } |
| | | return item; |
| | | }); |
| | | |
| | | this.setData({ |
| | | cameraList: cameraList |
| | | }); |
| | | |
| | | // 显示播放成功提示 |
| | | wx.showToast({ |
| | | title: `开始播放 ${camera.name}`, |
| | | icon: 'success' |
| | | }); |
| | | |
| | | console.log(`播放状态已更新,摄像头 ${camera.name} 开始播放RTMP流`); |
| | | } else { |
| | | console.log('URL格式不是RTMP,无法播放'); |
| | | wx.showToast({ |
| | | title: '播放地址格式不正确', |
| | | icon: 'error' |
| | | }); |
| | | } |
| | | |
| | | console.log('=== 播放视频结束 ==='); |
| | | }, |
| | | |
| | | /** |
| | | * 暂停视频 |
| | | */ |
| | | pauseVideo(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('暂停摄像头:', camera.name); |
| | | |
| | | // 更新视频播放状态 |
| | | const cameraList = this.data.cameraList.map(item => { |
| | | if (item.id === camera.id) { |
| | | return { |
| | | ...item, |
| | | isPlaying: false |
| | | }; |
| | | } |
| | | return item; |
| | | }); |
| | | |
| | | this.setData({ |
| | | cameraList: cameraList |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 停止视频 |
| | | */ |
| | | stopVideo(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('停止摄像头:', camera.name); |
| | | |
| | | // 更新视频播放状态 |
| | | const cameraList = this.data.cameraList.map(item => { |
| | | if (item.id === camera.id) { |
| | | return { |
| | | ...item, |
| | | isPlaying: false |
| | | }; |
| | | } |
| | | return item; |
| | | }); |
| | | |
| | | this.setData({ |
| | | cameraList: cameraList |
| | | }); |
| | | }, |
| | | |
| | | |
| | | |
| | | /** |
| | | * 直播播放器状态变化 |
| | | */ |
| | | onLivePlayerStateChange(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('直播播放器状态变化:', camera.name, e.detail); |
| | | |
| | | const { |
| | | code |
| | | } = e.detail; |
| | | |
| | | // 显示状态信息给用户 |
| | | let statusText = ''; |
| | | let isPlaying = false; |
| | | |
| | | switch (code) { |
| | | case 2001: |
| | | statusText = '已经连接服务器'; |
| | | break; |
| | | case 2002: |
| | | statusText = '已经连接 RTMP 服务器,开始拉流'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2003: |
| | | statusText = '网络接收到首个视频数据包(IDR)'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2004: |
| | | statusText = '视频播放开始'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2005: |
| | | statusText = '视频播放进度'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2006: |
| | | statusText = '视频播放结束'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2007: |
| | | statusText = '视频播放Loading'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2008: |
| | | statusText = '解码器启动'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2009: |
| | | statusText = '视频分辨率改变'; |
| | | isPlaying = true; |
| | | break; |
| | | case 2101: |
| | | statusText = '网络断连,且经多次重连抢救无效'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2102: |
| | | statusText = '获取加速拉流地址失败'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2103: |
| | | statusText = '当前视频帧解码失败'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2104: |
| | | statusText = '网络断连, 已启动自动重连'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2105: |
| | | statusText = '网络来断连, 且经多次重连抢救无效'; |
| | | isPlaying = false; |
| | | break; |
| | | case 2106: |
| | | statusText = '网络来断连, 且经多次重连抢救无效'; |
| | | isPlaying = false; |
| | | break; |
| | | default: |
| | | statusText = `未知状态码: ${code}`; |
| | | break; |
| | | } |
| | | |
| | | console.log(`摄像头 ${camera.name} 状态: ${statusText}`); |
| | | |
| | | // 更新播放状态 |
| | | const cameraList = this.data.cameraList.map(item => { |
| | | if (item.id === camera.id) { |
| | | return { |
| | | ...item, |
| | | isPlaying: isPlaying |
| | | }; |
| | | } |
| | | return item; |
| | | }); |
| | | |
| | | this.setData({ |
| | | cameraList: cameraList |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 直播播放器网络状态 |
| | | */ |
| | | onLivePlayerNetStatus(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('直播播放器网络状态:', camera.name, e.detail); |
| | | }, |
| | | |
| | | /** |
| | | * 直播播放器错误 |
| | | */ |
| | | onLivePlayerError(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.error('直播播放器错误:', camera.name, e.detail); |
| | | |
| | | wx.showToast({ |
| | | title: '直播播放失败', |
| | | icon: 'error' |
| | | }); |
| | | |
| | | // 更新播放状态 |
| | | const cameraList = this.data.cameraList.map(item => { |
| | | if (item.id === camera.id) { |
| | | return { |
| | | ...item, |
| | | isPlaying: false |
| | | }; |
| | | } |
| | | return item; |
| | | }); |
| | | |
| | | this.setData({ |
| | | cameraList: cameraList |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 全屏播放视频 |
| | | */ |
| | | fullscreenVideo(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('全屏播放:', camera.name); |
| | | |
| | | if (!camera.online) { |
| | | wx.showToast({ |
| | | title: '摄像头离线', |
| | | icon: 'error' |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | // 使用RTMP URL进行全屏播放 |
| | | if (camera.hslUrl) { |
| | | console.log('全屏视频URL:', camera.hslUrl); |
| | | |
| | | wx.showModal({ |
| | | title: '全屏播放', |
| | | content: `即将全屏播放 ${camera.name} 的视频流`, |
| | | confirmText: '开始播放', |
| | | success: (res) => { |
| | | if (res.confirm) { |
| | | // 这里可以跳转到全屏视频播放页面 |
| | | wx.showToast({ |
| | | title: '正在加载全屏视频...', |
| | | icon: 'loading' |
| | | }); |
| | | |
| | | // 模拟全屏视频加载 |
| | | setTimeout(() => { |
| | | wx.showToast({ |
| | | title: '全屏播放中', |
| | | icon: 'success' |
| | | }); |
| | | }, 1500); |
| | | } |
| | | } |
| | | }); |
| | | } else { |
| | | wx.showToast({ |
| | | title: '全屏视频地址无效', |
| | | icon: 'error' |
| | | }); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 摄像头设置 |
| | | */ |
| | | cameraSettings(e) { |
| | | const camera = e.currentTarget.dataset.camera; |
| | | console.log('摄像头设置:', camera.name); |
| | | |
| | | wx.showActionSheet({ |
| | | itemList: ['云台控制', '录像设置', '画质调节', '报警设置'], |
| | | success: (res) => { |
| | | const actions = ['云台控制', '录像设置', '画质调节', '报警设置']; |
| | | wx.showToast({ |
| | | title: `${actions[res.tapIndex]}功能开发中`, |
| | | icon: 'none' |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 获取气象站列表(兼容性方法,现在调用统一接口) |
| | |
| | | windDirectionAngle: content.windDirection, // 风向角度 |
| | | // 在线状态 |
| | | onLine: content.onLine, |
| | | // 计算在线状态 |
| | | online: content.onLine === 1, |
| | | // 格式化显示数据 |
| | | lastUpdate: content.dt || new Date().toLocaleString() |
| | | }; |
| | |
| | | windSpeed: 0.00, |
| | | windDirection: '北', |
| | | windDirectionAngle: 0, |
| | | onLine: 1, |
| | | onLine: false, |
| | | online: true, |
| | | lastUpdate: new Date().toLocaleString() |
| | | }; |
| | |
| | | soilTemperature4: 0.00, |
| | | soilTemperature5: 0.00, |
| | | // 在线状态 |
| | | onLine: 1, |
| | | online: true, |
| | | onLine: false, |
| | | lastUpdate: new Date().toLocaleString() |
| | | }; |
| | | |
| | |
| | | stirTime: 0, |
| | | stirDuration: 300, |
| | | injectDuration: 300, |
| | | onLine: 1, |
| | | onLine: false, |
| | | mixingEnabled: false, |
| | | fertilizingEnabled: false, |
| | | lastUpdate: new Date().toLocaleString() |