Javascript 检测是否<;音频>`pause`由用户交互或缓冲区运行不足引发的事件?

Javascript 检测是否<;音频>`pause`由用户交互或缓冲区运行不足引发的事件?,javascript,audio,html5-audio,mediaelement,mediasession,Javascript,Audio,Html5 Audio,Mediaelement,Mediasession,通过或播放实时音频流(如网络广播)时,暂停事件可以(至少)通过三种方式触发: 用户单击暂停按钮(使用 Android:浏览器的通知抽屉(至少是Chrome、Opera、Firefox) 桌面:控件,但未初始化,没有显式的setActionHandler(现在可能隐藏在标志后面) 由各种网络状况引起的缓冲区不足 是否可以区分1/2和3? 理想情况下,会有一个类似的事件属性,我缺少它 我试过猜测,尤其是看和,但这两个都是非常不确定的,尤其是在浏览器中(例如,拥有未来数据的解释/语义vs拥有足够的

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

  • 用户单击暂停按钮(使用
  • Android:浏览器的通知抽屉(至少是Chrome、Opera、Firefox)
  • 桌面:控件,但未初始化,没有显式的
    setActionHandler
    (现在可能隐藏在标志后面)
  • 由各种网络状况引起的缓冲区不足
  • 是否可以区分1/2和3?

    • 理想情况下,会有一个类似的事件属性,我缺少它
    • 我试过猜测,尤其是看和,但这两个都是非常不确定的,尤其是在浏览器中(例如,
      拥有未来数据的解释/语义
      vs
      拥有足够的数据
    • 我一直避免制造“衰退状态机”,处理其他事件。缓冲区运行不足之前通常会出现
      stalled
      事件,有时之后会出现
      end
      事件。跨浏览器实现似乎非常复杂,误报的危险性非常高
    在媒体采访之前我是不是运气不好

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

    事件应该适合您的需要

    你可以在Chrome的“网络”选项卡中的下拉菜单中模拟糟糕的网络时尝试此演示(例如:慢速3G)

    const video=document.getElementById('mwe_player_0');
    video.onwaiting=function(){console.log('onwaiting');};

    如果您想在用户暂停音频时启动一个事件,则此代码段将完成此任务。我没有在通知抽屉中的mobile上测试它,但我认为它可以工作

    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.');
    });
    
    :音频元素事件

    :暂停事件

    我还找到了一个有用的答案,回答了你想做什么(至少从我的理解来看),以及为什么这是一种糟糕的技术


    3Events:stalled/waiting检查事件资源

    谢谢,但我还是要设置一些标志,比如
    was\u waiting
    ,然后说明
    暂停
    可能是一个网络事件(需要经过多少时间才能结束?)。如果不够清楚:我必须处理
    暂停
    ,找不到替代方案。我在类似的
    结束
    事件的狭义用例中取得了一些成功:对于预期将播放的直播流(再次,一个标志),在
    结束之前的
    暂停
    事件变得毫无意义-我可以推断,任何其他
    暂停
    都必须是用户交互…直到出现新的控制方案;)…tl;dr:我已经看过这个和其他事件,充其量只是令人沮丧的隐式猜测。为什么你必须处理
    pause
    事件,而它不会在缺少数据时触发?
    pause
    事件确实发生在有限的资源中,它们只对实时流有意义。对不起,请打开。这只会侦听事件,但不会识别其来源。另外,我也没有尝试做任何经典意义上的UA/移动嗅探。