是啥导致桌面 Safari html 音频 currentTime 不准确?

Posted

技术标签:

【中文标题】是啥导致桌面 Safari html 音频 currentTime 不准确?【英文标题】:What causes desktop Safari html audio currentTime inaccuracy?是什么导致桌面 Safari html 音频 currentTime 不准确? 【发布时间】:2019-01-10 10:06:12 【问题描述】:

我在一个项目中工作,我需要创建准确的音频编辑器。

我注意到,在音频上设置 currentTime 时,Safari 有一些古怪的行为。看来,根据跳转发生的当前时间和跳转的位置,实际时间点甚至可以偏离 2-3 秒。

我发了JS fiddle to demonstrate the issue。

代码的相关部分如下:

jump.addEventListener('click', function () 
  audio.currentTime = jumpToVal;
);

jump2.addEventListener('click', function () 
  audio.currentTime = Number.parseInt(jumpToVal) + Number.parseInt(jumpBufferVal);
  audio.volume = 0;
  setTimeout(function () 
    audio.volume = 1;
    audio.currentTime = jumpToVal;
  , jumpDelayVal)
);

因此,在此示例中基本上发生的情况是,如果在该点过去后尝试在音频中跳转到 8 秒,则音频会在该点之前几秒钟开始播放。例如,如果将 currentTime 设置为比该点少 8 秒,并且在延迟跳转到该点后,它会从正确的位置开始播放。

我想强调一下,这很可能只是一个巧合,因为行为的变化取决于 currentTime 设置的位置和时间点。这个设置最清楚问题。

例如与 Chrome 进行比较以了解差异。

奇怪的是,无论最终结果如何,音频都会返回相同的 currentTime。所以换句话说,音频似乎“认为”它处于正确的位置,即使它显然不是。

我的问题是,为什么 Safari 对 currentTime 如此不准确,是否有解决此问题的方法?

Safari 版本 12.0 (14606.1.36.1.9)。

【问题讨论】:

您找到解决方案了吗?我在 OS X 和 ios 上遇到了这个问题 【参考方案1】:

媒体格式会导致问题。

当媒体是 flac(可能还有其他格式)时,Seek/currentTime 更新在 safari 上无法可靠地工作。

但是,当我将媒体格式切换为mp3时,它和chrome一样可靠!

【讨论】:

是的。 Apple 长期以来一直存在 VBR(可变比特率)MP3 的不准确搜索问题。这就是为什么播客经常使用 CBR(恒定比特率)MP3 编码的原因。我认为该问题不会影响 AAC 文件,因为它们使用不同的容器格式。 marco.org/2016/08/15/vbr-mp3-plea【参考方案2】:

我无法确定访问该 MP3 文件,但我很确定问题是由 VBR MP3 引起的。

Apple 的 MP3 播放管道长期以来一直拥有issues with accurate seeking within VBR(可变比特率,大多数 MP3)MP3。它会影响 Mac OS 或 iOS 上使用本机 MP3 解码器的任何东西。由于这个原因,大多数播客都是 CBR MP3 - 播客应用程序也使用本机解码器。

有几个选项可以解决这个问题:

    将 MP3 音频流从 MPEG-1 容器(MP3 = MPEG-1 第 3 层)混合到 MPEG-4/MP4 容器(例如ffmpeg -i myFile.mp3 -c copy myFile.m4a)中。这是一个快速无损的过程,文件可以在任何浏览器中运行。 将音频文件编码为 AAC/m4a。这也使用 MPEG-4 容器,可以在任何地方播放。将 MP3 重新编码为 AAC 总是会降低音质。 如果必须是 MP3,则使用 CBR(恒定比特率,效率较低)编码(重新)编码。重新编码 MP3 总是会降低音质。

【讨论】:

我一直在使用 m4a 并且遇到过类似的问题。我会尽快重新制作并运行。

以上是关于是啥导致桌面 Safari html 音频 currentTime 不准确?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Javascript 在移动 Safari 和所有其他浏览器上录制音频?

是啥导致 Safari 无法在此代码中获取 navigator.geolocation.getCurrentPosition?

小米手机safari怎么设置自动播放?

ipad上的背景音频不会停止

safari 13.1 navigator.mediaDevices.enumerateDevices()仅返回音频设备

iPad Safari 是不是支持 <EMBED> 音频?