如何使用MediaSource 寻找音频并继续播放?

How to seek audio with MediaSource and continue playing?

我目前正在尝试为我的 Angular 网络应用程序实现音频播放器 a tutorial on Google Developers and also some help I've found on " Can't seek video when playing from MediaSource ".

我的情况最大的不同是我想 流式传输 音频块,这样用户就不必下载整个文件来收听马上。

从头到尾听一首曲目已经在工作了,因为我只是从服务器下载字节块,并在每个块到达时简单地将每个块附加到 SourceBuffer

但是,我无法实现“查找”功能。

我不太明白如何在客户端处理这个问题。目前我只处理 mp3 文件。我找不到 任何 解释 seeking 的例子。

我知道 audio 元素的设置 currentTime 将根据 Media Events doc 触发 seeking 事件。 我们有:

this.audioObj = document.createElement('audio');

和一个setter:

public seekTo(seconds) {
  this.logger.debug(`seekTo ${seconds.toFixed(2)} seconds`);
  // Setting currentTime will cause a "seeking" event to be emitted.
  this.audioObj.currentTime = seconds;
}

认为 我必须在设置 currentTime 并将其附加到 sourceBuffer 之前加载新数据。但是,由于显而易见的原因,这根本行不通。

我怎样才能使这个工作?

如果你已经设置了时长,你应该可以设置currentTime但是没有任何东西可以播放。您可以使用 currentTime 来通知块提取器您需要文件的哪一部分并附加它以便媒体元素可以继续播放。

请注意,当使用 mp3 时,SourceBuffer 将在 sequence 模式下运行,因为没有时间戳,这意味着如果您只是盲目地附加字节,它们将不会在正确的时间点 - 我相信您需要将 timestampOffset 设置为相关帧的相关时间(我自己还没有尝试过)。