HBBTV调用play()被pause()中断致视频播放失败问题求助
HBBTV播放报错:Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause()
问题背景
使用BBC TAL框架时,调用原生视频对象的play()方法触发Promise执行失败,出现上述报错。已将this._mediaElement.preload设置为auto,视频在video.js中可正常播放,但无法修改HBBTV原生视频对象。
原代码存在变量名不一致问题(定义promise但判断playPromise),修正后的代码示例:
var playPromise = this._mediaElement.play(); if (playPromise !== undefined) { playPromise.then(function() { // Automatic playback started! }).catch(function(error) { // Automatic playback failed. console.log(error); }); }
错误原因分析
该报错本质是play()的Promise处于pending状态时,pause()被提前调用——大概率是BBC TAL框架内部存在自动触发暂停的逻辑,或是HBBTV原生视频对象的资源加载状态不稳定,导致播放请求被中断。
解决方案
1. 等待视频资源就绪后再触发播放
HBBTV设备的原生视频对象对资源加载的处理和Web端存在差异,即使preload设为auto,也建议监听canplaythrough事件,确保视频资源足够播放后再调用play():
this._mediaElement.addEventListener('canplaythrough', () => { const playPromise = this._mediaElement.play(); if (playPromise) { playPromise.then(() => { console.log('播放启动成功'); }).catch(err => { console.error('播放失败:', err); }); } }, { once: true });
2. 避开框架内部的暂停逻辑冲突
BBC TAL框架可能在组件生命周期、焦点切换等场景自动调用pause(),可通过延迟调用play()避开冲突:
// 延迟100ms执行,避开框架内部可能的暂停操作 setTimeout(() => { const playPromise = this._mediaElement.play(); if (playPromise) { playPromise.then(() => {}).catch(err => console.error(err)); } }, 100);
3. 确保播放触发符合HBBTV设备的交互要求
部分HBBTV设备强制要求播放必须由用户交互触发(如遥控器按键),避免自动执行play(),将播放逻辑绑定到用户操作事件中:
// 示例:绑定遥控器确认键事件 document.addEventListener('keydown', (e) => { if (e.keyCode === 13) { // 确认键的keyCode需根据设备调整 const playPromise = this._mediaElement.play(); if (playPromise) { playPromise.then(() => {}).catch(err => console.error(err)); } } });
内容的提问来源于stack exchange,提问作者Ubaid Ashraf
相关产品推荐
相关产品推荐

