# 萤石云播放器故障排查流程 > 快速定位和解决问题 --- ## 🔍 问题诊断流程图 ``` 视频无法播放 ↓ 是否显示黑屏? ├─ 是 → 检查AccessToken │ ├─ 已过期 → 刷新Token │ └─ 有效 → 检查设备状态 │ └─ 否 → 是否显示加载中? ├─ 是 → 检查网络 │ ├─ 网络正常 → 检查play_url格式 │ └─ 网络异常 → 修复网络 │ └─ 否 → APP是否崩溃? ├─ 是 → 查看崩溃日志 │ └─ OutOfMemoryError → 已使用iframe方案? │ ├─ 否 → 切换到iframe方案 │ └─ 是 → 检查manifest.json │ └─ 否 → 其他问题 → 查看详细日志 ``` --- ## 🚨 常见错误码速查 ### 1. 黑屏不播放 **症状:** - 页面加载完成 - 显示黑色屏幕 - 无加载提示 **排查步骤:** ```javascript // ✅ 步骤1: 检查AccessToken console.log('AccessToken:', accessToken) console.log('Token长度:', accessToken.length) // 应该>50 // ✅ 步骤2: 检查play_url格式 console.log('PlayUrl:', play_url) // 正确格式: ezopen://open.ys7.com/K74237657/1.hd.live // ✅ 步骤3: 检查iframe URL console.log('iframeUrl:', iframeUrl) // 应该包含: https://open.ys7.com/ezopen/h5/iframe? // ✅ 步骤4: 测试Token有效性 uni.request({ url: 'https://open.ys7.com/api/lapp/device/list', method: 'POST', data: { accessToken: accessToken }, success: (res) => { console.log('Token测试结果:', res.data) } }) ``` **解决方案:** ```javascript // 方案1: 刷新Token uni.removeStorageSync('ezviz_access_token') const newToken = await tokenManager.getValidAccessToken() // 方案2: 检查设备序列号 // 确认设备序列号正确,格式: K74237657 // 方案3: 切换清晰度 play_url: "ezopen://open.ys7.com/K74237657/1.sd.live" // 标清 ``` --- ### 2. APP 崩溃(OutOfMemoryError) **症状:** ``` FATAL EXCEPTION: main java.lang.OutOfMemoryError: Failed to allocate... ``` **检查清单:** ```bash # ✅ 1. 确认使用iframe方案 grep -r "ezuikit.js" src/ # 如果有结果 → 错误!不应该加载本地SDK # ✅ 2. 检查manifest.json cat src/manifest.json | grep largeHeap # 应该有: "largeHeap": true # ✅ 3. 查看实际内存使用 adb shell dumpsys meminfo 包名 ``` **解决方案:** ```json // ① 确保manifest.json配置正确 { "app-plus": { "compatible": { "largeHeap": true } } } // ② 使用iframe方案 // src/static/html/ezviz-iframe.html // ③ 不要加载本地SDK // ❌ 删除这行: ``` --- ### 3. 组件引用错误 **症状:** ```javascript Cannot read properties of undefined (reading 'initEzuikit') ``` **原因分析:** ```javascript // ❌ 错误代码 this.$nextTick(() => { this.$refs.playerVideoRef.initEzuikit(config) // ref不存在! }) this.ezstate = true // 这时才开始渲染 // 问题:ezstate=false时,组件不在DOM中,ref是undefined ``` **解决方案:** ```javascript // ✅ 正确代码 // 1. 先渲染组件 this.ezstate = true // 2. 等待Vue更新DOM await this.$nextTick() // 3. 安全调用(添加检查) if (this.$refs.playerVideoRef) { this.$refs.playerVideoRef.initEzuikit(config) } else { console.error('播放器组件未找到') } ``` --- ### 4. 视频画面变形 **症状:** - 视频能播放 - 画面被拉伸或压缩 - 不是原始比例 **检查代码:** ```scss // ❌ 错误:直接设置固定高度 .video-content { width: 100%; height: 100vh; // 会导致变形! } // ✅ 正确:使用padding-top保持16:9 .video-content { width: 100%; position: relative; &::before { content: ''; display: block; padding-top: 56.25%; /* 16:9比例 */ } :deep(.simple-video-player) { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } } ``` **其他比例参考:** ```scss /* 16:9 */ padding-top: 56.25%; /* 4:3 */ padding-top: 75%; /* 1:1 */ padding-top: 100%; /* 21:9 */ padding-top: 42.86%; ``` --- ### 5. 加载很慢 **症状:** - 长时间显示"正在加载..." - 超过10秒没反应 **排查步骤:** ```javascript // ✅ 1. 测试网络速度 uni.request({ url: 'https://open.ys7.com', success: (res) => { console.log('萤石云连接正常') }, fail: (err) => { console.error('网络异常:', err) } }) // ✅ 2. 切换清晰度 // 高清 → 标清 play_url: "ezopen://open.ys7.com/K74237657/1.sd.live" // ✅ 3. 检查设备状态 import deviceChecker from '@/utils/ezvizDeviceChecker.js' const result = await deviceChecker.comprehensiveCheck(play_url) console.log('设备状态:', result) ``` **优化方案:** ```javascript // 方案1: 预加载AccessToken onLoad() { // 提前获取token tokenManager.getValidAccessToken() } // 方案2: 添加超时处理 setTimeout(() => { if (this.loading) { this.error = true this.errorText = '加载超时,请重试' } }, 15000) // 15秒超时 // 方案3: 使用标清 play_url: "ezopen://open.ys7.com/K74237657/1.sd.live" ``` --- ## 🛠 调试工具 ### 1. Chrome 远程调试 ```bash # ① 启用ADB调试 adb devices # ② 在Chrome中打开 chrome://inspect/#devices # ③ 找到WebView进程,点击inspect ``` ### 2. ADB 日志查看 ```bash # 查看所有日志 adb logcat # 只看错误 adb logcat *:E # 过滤关键字 adb logcat | grep -i "chromium\|console\|memory" # 查看崩溃日志 adb logcat | grep -i "fatal\|crash" ``` ### 3. 控制台调试 ```javascript // 在Vue组件中 console.log('[调试] 初始化配置:', config) console.log('[调试] ref存在:', !!this.$refs.playerVideoRef) console.log('[调试] ezstate:', this.ezstate) // 在HTML中 ``` --- ## 📋 完整检查清单 ### 部署前检查 ``` □ 萤石云账号配置 □ AppKey已配置 □ AppSecret已配置 □ 设备序列号正确 □ 验证码正确 □ 文件完整性 □ EzvizVideoPlayerSimple.vue 存在 □ ezviz-iframe.html 存在 □ ezvizTokenManager.js 存在 □ pages.json 配置正确 □ manifest.json 配置正确 □ 代码正确性 □ 使用iframe方案(非SDK) □ 组件调用顺序正确 □ 16:9比例设置正确 □ 横屏配置正确 □ 功能测试 □ AccessToken获取成功 □ 视频能正常播放 □ 播放/暂停功能正常 □ 刷新功能正常 □ 切换摄像头正常 ``` ### 运行时检查 ``` □ 网络连接正常 □ AccessToken未过期 □ 设备在线 □ 内存占用<200MB □ 无崩溃 □ 画面不变形 □ 音频正常 ``` --- ## 🆘 紧急修复 ### 快速恢复(5分钟) 如果系统完全不能用,按以下步骤快速恢复: ```javascript // ① 清除所有缓存 uni.clearStorageSync() // ② 使用备用Token(临时) const backupConfig = { accessToken: "at.4dd7o6hgdb9ywl9c283g0hj27e789uru-2a5ejk6tkf-19b1cb1-azyfqm3a", play_url: "ezopen://open.ys7.com/K74237657/1.sd.live" // 标清 } // ③ 重启APP // 在 APP.vue 的 onLaunch 中清除缓存 onLaunch() { console.log('APP启动,清除缓存') uni.clearStorageSync() } ``` --- ## 📞 获取帮助 ### 查看日志位置 ``` ✅ Vue组件日志:开发者工具 Console ✅ APP日志:adb logcat ✅ web-view日志:Chrome inspect ✅ 萤石云日志:萤石云控制台 ``` ### 常用命令 ```bash # 连接设备 adb devices # 查看日志 adb logcat | grep -i "console" # 清除APP数据 adb shell pm clear 包名 # 重启APP adb shell am force-stop 包名 adb shell am start 包名/.MainActivity ``` --- ## 🔗 相关文档 - 📖 [完整指南](./萤石云APP对接完整指南.md) - 📝 [快速参考](./README-萤石云对接.md) - 🌐 [萤石云API文档](https://open.ys7.com/doc/) --- **最后更新:** 2025-10-06 **版本:** v1.0 --- 💡 **提示:** 90%的问题都是 AccessToken 过期或配置错误导致的!