3

<audio>当通过或播放实时音频流(如网络广播)时,Audio()暂停事件可以(至少)三种方式触发:

  1. 用户点击暂停按钮(带有<audio controls>
  2. 用户单击浏览器的全局音频控件
    • iOS:控制中心
    • Android:浏览器的通知抽屉(至少 Chrome、Opera、Firefox)
    • 桌面:媒体会话 API控件,但未初始化,没有显式setActionHandler(目前可能隐藏在标志后面)
  3. 各种网络条件导致的缓冲区不足

可以区分 1/2 和 3 吗?

  • 理想情况下,会有一个类似的事件属性isTrusted,我错过了
  • 我试图猜测,特别是看起来。atreadyState和,但两者都非常不确定,尤其是跨浏览器(例如vsnetworkState的解释/语义)HAVE_FUTURE_DATAHAVE_ENOUGH_DATA
  • 我回避了制作“衰变状态机”,同时处理其他事件。缓冲区欠载通常stalled发生在事件之前,有时也发生在ended事件之后。跨浏览器的实现看起来非常复杂,误报的风险非常高。

在 Media Session无处不在之前,我是否不走运?

注意:这个问题看起来像是一个解决方案,但不幸的是不是——浏览器以不同且不一致的方式处理直播流的“结束”。

4

2 回答 2

0

waiting活动应符合您的需求。

您可以在使用 Chrome 网络选项卡中的下拉菜单模拟坏网络时尝试此演示(例如:Slow 3G)

const video = document.getElementById('mwe_player_0');
video.onwaiting = function() { console.log('onwaiting'); };
<video id="mwe_player_0" controls="" preload="none" style="width:800px;height:450px"><source src="https://upload.wikimedia.org/wikipedia/commons/2/22/Volcano_Lava_Sample.webm" type="video/webm; codecs=&quot;vp8, vorbis&quot;"></video>

请注意,此演示也适用HTMLAudioElement(因为它继承了HTMLMediaElement)。视频演示更容易测试。

于 2020-02-17T17:21:11.713 回答
0

如果您想在用户暂停音频时启动一个事件,那么这个片段将完成这项工作。我没有在通知抽屉的移动设备上对其进行测试,但我认为它会起作用。

const video = document.querySelector('video');

video.addEventListener('pause', (event) => {
  console.log('The Boolean paused property is now true. Either the ' + 
  'pause() method was called or the autoplay attribute was toggled.');
});

资源:音频元素事件

资源:暂停事件

我还找到了一个有用的答案来回答你想要做什么2(至少从我的理解来看)以及为什么它是一种糟糕的技术。链接到问题

3事件:停滞/等待检查事件资源

于 2020-02-24T10:46:21.147 回答