【问题标题】:How to stop Safari clipping fractions of time off audio on second play如何在第二次播放时停止 Safari 剪辑音频的时间分数
【发布时间】:2021-05-21 01:23:13
【问题描述】:

事实证明,当您使用 javascript 触发音频时。在最新版本的 safari 中,如果你使用 obj.play() 两次,第二次,部分音频被切断(至少在 mac 上)。在 Chrome 中不会出现此问题。仅在 Safari 上。

有人知道解决这个问题的方法吗?

<a href="javascript:playWord()">Play</a>
<audio id="t" src="https://biblicaltext.com/audio/%e1%bc%a4.mp3"></audio>
<script>
function playWord(word) {
    a = document.getElementById('t');
    //a.currentTime = 0
    a.play();
    //a.src = a.src
}
</script>

https://jsfiddle.net/8fbt7rgc/1/

使用a.src = a.src 重新下载文件可以,但并不理想。

【问题讨论】:

  • 该文件是否由 biblicaltext.com 托管,或者您可以将其托管在同源的某个地方吗?或者代码会从 biblicaltext.com 源运行吗?
  • @Kaiido 我选择链接到确切的原始文件,以防它在某种程度上很重要。 (我不确定)。需要明确的是,代码来自同源网站。

标签: javascript html audio


【解决方案1】:

这听起来像是一个错误,他们应该是made aware of

目前,如果您可以访问以同源方式播放的文件,则可以使用Web Audio API 及其AudioBufferSourceNode 接口以比通过HTMLMediaElements 更高的精度和更少的延迟来播放您的媒体:

(async () => {
  const ctx = new (window.AudioContext || window.webkitAudioContext)();
  // Using a different file because biblicaltext.com
  // doesn't allow cross-origin requests
  const data_buf = await fetch("https://dl.dropboxusercontent.com/s/agepbh2agnduknz/camera.mp3")
    .then( resp => resp.arrayBuffer() );
  const audio_buf = await ctx.decodeAudioData(data_buf);

  document.querySelector("a").onclick = (evt) => {
    evt.preventDefault();
    const source = ctx.createBufferSource();
    source.buffer = audio_buf;
    source.connect(ctx.destination);
    source.start(0);
  }
})();
<!-- Promising decodeAudioData for old Safari https://github.com/mohayonao/promise-decode-audio-data/ [MIT] -->
<script src="https://cdn.rawgit.com/mohayonao/promise-decode-audio-data/eb4b1322/build/promise-decode-audio-data.min.js"></script>
<a href="#">Play</a>

【讨论】:

  • 哇,谢谢!我不知道 Web Audio API(我不是 Javascript 专家),但这看起来很有希望。它似乎没有IE。完全支持,但有可能做一个后备。我现在对此进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多