You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript Media Session API问题:暂停正常,播放失效如何修复?

修复Chrome中Media Session暂停按钮不切换为播放按钮的问题

问题出在Web Audio API的异步操作与Media Session状态更新的时机不匹配:audioCtx.suspend()和audioCtx.resume()都是异步方法,会返回Promise,原代码中直接在调用后立即设置playbackState,可能导致Media Session未正确捕获到状态变化,从而无法切换按钮状态。

修复后的代码

<button id="button">Initialize</button>
if ('mediaSession' in navigator) {
  let audioCtx, oscillator, gainNode;

  // 修改为异步处理器,等待异步操作完成后更新状态
  navigator.mediaSession.setActionHandler('play', async () => {
    await audioCtx.resume();
    navigator.mediaSession.playbackState = 'playing';
  });

  navigator.mediaSession.setActionHandler('pause', async () => {
    await audioCtx.suspend();
    navigator.mediaSession.playbackState = 'paused';
  });

  if ('setPositionState' in navigator.mediaSession) {
    navigator.mediaSession.setPositionState({
      duration: 20,
      position: 0,
    });
  }

  button.onclick = async () => {
    if (!audioCtx) {
      audioCtx = new AudioContext();
      oscillator = audioCtx.createOscillator();
      gainNode = audioCtx.createGain();
      oscillator.connect(gainNode);
      gainNode.connect(audioCtx.destination);
      oscillator.frequency.value = 440;
      gainNode.gain.value = 0.1;
      oscillator.start();
      await audioCtx.resume();
      navigator.mediaSession.playbackState = 'playing';
    }
  };
}

关键改动说明

  • 将play和pause的动作处理器改为异步函数,通过await等待resume()/suspend()操作完成后,再更新navigator.mediaSession.playbackState,确保状态完全同步。
  • 异步操作完成后再更新状态,能让Chrome的Media Session正确感知到播放状态变化,从而触发按钮的显示切换。

内容的提问来源于stack exchange,提问作者root

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:42:29