如何处理未捕获(承诺)DOMException:播放()请求被暂停()调用中断

Posted

技术标签:

【中文标题】如何处理未捕获(承诺)DOMException:播放()请求被暂停()调用中断【英文标题】:How to handle Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause() 【发布时间】:2017-03-09 16:07:50 【问题描述】:

下面是我在 aspx 页面中的代码,允许在浏览器中播放 wav 格式的音频,但使用我当前的代码,我无法在 Chrome 浏览器中播放 wav 音频,但它可以在 Firefox 中播放。我该如何处理这个异常?

<script>
    window.onload = function ()  document.getElementById("audio").play(); 
    window.addEventListener("load", function ()  document.getElementById("audio").play(); );
</script>

<body>
    <audio id='audio' controls autoplay>
        <source src="Sounds/DPM317.wav" type="audio/wav" />
        Your browser does not support the audio element.
    </audio>
</body>

【问题讨论】:

您为什么在页面加载时尝试运行play() 两次?删除其中一条线以改善生活 【参考方案1】:

对于 Chrome,他们更改了自动播放政策,因此您可以阅读 here:

var promise = document.querySelector('audio').play();

if (promise !== undefined) 
    promise.then(_ => 
        // Autoplay started!
    ).catch(error => 
        // Autoplay was prevented.
        // Show a "Play" button so that user can start playback.
    );

【讨论】:

【参考方案2】:

我不知道这对你来说是否仍然是真实的,但我仍然留下我的评论,所以也许它会帮助其他人。 我有同样的问题,@dighan 在bountysource.com/issues/ 上提出的解决方案 帮我解决了。

所以这是解决我问题的代码:

var media = document.getElementById("YourVideo");
const playPromise = media.play();
if (playPromise !== null)
    playPromise.catch(() =>  media.play(); )

它仍然会向控制台抛出错误,但至少视频正在播放:)

【讨论】:

【参考方案3】:

尝试在 catch 块中使用这样的回调。

document.getElementById("audio").play().catch(function() 
    // do something
);

【讨论】:

如果 play 没有返回承诺,它将中断(目前,我相信 play() 只在 Chrome 中返回承诺) 我再次收到此未捕获的类型错误:无法读取 null 的属性“播放” 你确定你的 DOM 在被调用播放时已经加载了吗? document.addEventListener("DOMContentLoaded", function (event) var audio = document.getElementsByTagName("audio")[0]; audio.pause(); ); 我用这种方式滴滴没有错误,但没有播放音频 window.onload = function () document.getElementById("audio").play().catch(function() console.log('hello exception'); );跨度> 【参考方案4】:
    所有新浏览器都支持仅静音自动播放视频 所以请把

<video autoplay muted="muted" loop id="myVideo"> <source src="https://w.r.glob.net/Coastline-3581.mp4" type="video/mp4"> </video>

像这样的

    如果您的网站使用 https 运行,则视频 URL 应与 SSL 状态匹配,那么视频 URL 也应为 https,对于 HTTP 也是如此

【讨论】:

【参考方案5】:

muted="muted" 属性添加到 html5 标记解决了我的问题

【讨论】:

【参考方案6】:

我使用的是 Chrome 版本 75。

将静音属性添加到视频标签

<video id="myvid" muted>

然后使用javascript播放它并将静音设置为false

var myvideo = document.getElementById("myvid");
myvideo.play();
myvideo.muted = false;

编辑:需要用户交互(至少点击页面中的任意位置才能工作)

【讨论】:

【参考方案7】:

我第二个 Shobhit Verma,我有一点要补充:在他的帖子中,他告诉在 Chrome(我自己的 Opera)中,玩家需要静音才能使自动播放成功......具有讽刺意味的是,如果加载后提高音量,它仍然会播放... 就像所有那些忽略不可见框架的反弹出窗口机制滑入您的代码一样...... php-echoed html 和 javascript 是: 10 秒 setTimeout onLoad 将音量增加到最大的 body 标签,自动播放视频和 muted='muted'(是的,$muted_code 部分是 = "muted='muted")

echo "<body style='margin-bottom:0pt; margin-top:0pt; margin-left:0pt; margin-right:0pt' onLoad=\"setTimeout(function() var vid = document.getElementById('hourglass_video'); vid.volume = 1.0;,10000);\">";
    echo "<div id='hourglass_container' width='100%' height='100%' align='center' style='text-align:right; vertical-align:bottom'>";
    echo "<video autoplay $muted_codetitle=\"!!! Pausing this video will immediately end your turn!!!\" oncontextmenu=\"dont_stop_hourglass(event);\" onPause=\"$action\" id='hourglass_video' frameborder='0' style='width:95%; margin-top:28%'>";

【讨论】:

【参考方案8】:

就我而言,我必须等待用户交互,因此我设置了一个 clicktouchend 监听器。

const isMobile = navigator.maxTouchPoints || "ontouchstart" in document.documentElement;

function play()
    audioEl.play()



document.body.addEventListener(isMobile ? "touchend" : "click", play,  once: true );

【讨论】:

以上是关于如何处理未捕获(承诺)DOMException:播放()请求被暂停()调用中断的主要内容,如果未能解决你的问题,请参考以下文章

swift - 如何处理未捕获的异常

如何处理未捕获的错误:对象作为 React 子错误无效

未捕获(承诺)DOMException:超出配额

IndexedDB:未捕获(承诺)DOMException

如何防止错误“未捕获(承诺中)DOMException:播放()请求被暂停()调用中断。”?

Chrome:未捕获(承诺)DOMException:加载失败,因为找不到支持的源