针对Discuz论坛用户反馈的蓝牙耳机连接后视频卡顿问题,以下是专业排查方案:
**一、前端播放器设备重载方案**
1. 在Discuz模板文件中找到播放器容器元素(如`<video id="dz_player">`)
2. 添加以下设备切换监听代码:
- navigator.mediaDevices.ondevicechange = function() {
- let player = document.getElementById('dz_player');
- if(player) {
- player.src = player.src; // 强制重载视频源
- player.play().catch(e => console.log('需要用户交互'));
- }
- };
复制代码
**二、音频轨道强制绑定方案**
针对HLS.js播放器场景,增加音频轨道监听:
- if(Hls.isSupported()) {
- hls.on(Hls.Events.MANIFEST_PARSED, function() {
- hls.audioTracks.forEach((track, index) => {
- hls.audioTrack = index;
- });
- });
- }
复制代码
**三、Discuz内核优化方案**
1. 修改`source/class/class_media.php`中播放器初始化逻辑
2. 在`_getvideohtml`方法内增加设备准备检查:
- $autoplay = $_G['setting']['autoplay'] ? ' autoplay' : '';
- // 增加设备检测参数
- $html .= '<video id="dzplayer"'.$autoplay.' playsinline webkit-playsinline>';
复制代码
**四、缓存策略优化**
在`/static/js/common.js`中增加媒体设备指纹:
- let audioHash = CryptoJS.MD5(navigator.mediaDevices.getUserMedia());
- localStorage.setItem('audio_device', audioHash);
复制代码
**五、兼容性解决方案**
创建`/plugin/bluetooth_fix`插件目录,包含:
1. `hook.class.php`注册设备变更钩子
2. `player.js`实现音频上下文重建:
- function resetAudioContext() {
- if(window.audioCtx) {
- window.audioCtx.close();
- }
- window.audioCtx = new (window.AudioContext || window.webkitAudioContext)();
- }
复制代码
建议通过DZ插件网搜索「音频设备兼容」获取已封装解决方案,该问题通常与Web Audio API的设备绑定机制有关,需要同时处理MediaSession API的元数据更新。具体实现可参考DZX的媒体处理规范文档。
**注意事项:**
1. 需在Discuz后台关闭「HTML5音频优化」实验性功能
2. 检查用户组权限中的「媒体设备访问」权限是否开启
3. 建议在论坛公告栏添加浏览器兼容性提示模板
以上方案需根据实际使用的播放器类型(原生/Hls.js/DPlayer)做适配调整,完整的设备兼容处理应包含MediaDeviceInfo的定期轮询和自动重连机制。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |