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

  • 用户单击暂停按钮(带有<audio controls>)
  • 用户单击浏览器的全局音频控件
  • iOS:Control Center
  • Android:浏览器的通知抽屉(至少是Chrome,Opera,Firefox)
  • 桌面:Media Session API控件,但未初始化,没有明确的setActionHandler(到目前为止可能隐藏在标志后面)
  • 由各种网络条件引起的缓冲区不足

  • 是否可以区分1/2和3?
  • 理想情况下,会有一个像 isTrusted 这样的事件属性,但我缺少
  • 我试图猜测,尤其是。 readyState networkState ,但两者都没有定论,尤其是在浏览器中(例如HAVE_FUTURE_DATAHAVE_ENOUGH_DATA的解释/语义)
  • 我回避制作“正在衰减的状态机”,并处理其他事件。缓冲区欠载通常在stalled事件之前,有时在ended事件之后。跨浏览器的实现似乎很复杂,而且误报的危险非常高。

  • 在到处都有Media Session lands之前,我是否很幸运?

    注意:this question看起来像一个解决方案,但不幸的是,它不是-浏览器以不同且不一致的方式处理实时流的“结束”。

    最佳答案

    waiting 事件应符合您的需求。

    您可以在Chrome的“网络”标签的下拉菜单中模拟不良网络时尝试该演示(例如:慢速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)。视频演示更易于测试。

    09-25 18:37
    查看更多