Web 音频 API:如何播放 DASH 流中的音频而不产生音频失真?

问题描述 投票:0回答:1

我正在尝试使用自定义播放器播放来自

https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd
的音频。我的播放器执行以下操作:

  1. 使用 Web 一次下载并解码音频的每个片段 音频API的AudioDecoder
  2. 将每个段的所有解码数据拼接到每个通道的 4(4 左右,因为它实际上是 192512/48000)秒长的 Float32Array 中。
  3. 使用
    AudioBufferSource
    创建一个
    audioCtx.createBufferSource()
    并将 Float32Arrays 缓冲区附加到它。
  4. 使用计时信息安排
    AudioBufferSource
    播放。因此,第一段安排在 0 播放
    segment.duration
    ,第二段安排在前一段的结束时间,依此类推。

执行此操作时,片段之间有大约 0.1 秒的沉默。此外,大多数(但不是所有片段)的开头包含大约 360 个样本,其中只有 0。

当我通过 dash.js 播放器播放相同的 DASH 流时,我没有得到相同的效果。我看到的问题是我的调度算法、解码策略,还是其他播放器做了一些奇特的事情来将声音混合在一起以防止出现这种伪影?

web-audio-api mpeg-dash
1个回答
0
投票
  1. 使用计时信息安排 AudioBufferSource 播放。因此,第一个片段被安排在 0 播放片段.duration,第二个片段从前一个片段的结束时间开始播放,依此类推。

不,那是行不通的。

您需要样本精确的东西,当您以秒或毫秒为单位测量时间时,这基本上是不可能做到的。事情并不总是能很好地分割,所以即使你的日程安排非常准确,也总会有一个小故障。

可以通过管理自己的缓冲区并创建用于播放的 ScriptProcessorNode 来解决该问题,但该方法不适合您的数据源...继续阅读...

此外,大多数(但不是所有片段)的开头包含大约 360 个样本,而这些样本仅为 0。

这是使用有损编解码器时的常见问题。有时,一帧中的数据依赖于另一帧。而且,开始一个新段需要一些初始化。问题是你要单独解码这些块,但你不应该这样做。

其他玩家是否有一些奇特的方法将声音混合在一起以防止出现这种伪影?

是的。他们根本不使用这种方法。他们使用 MediaSource Extensions 将媒体数据缓冲区推送到浏览器中,并让浏览器完成所有解码和缓冲等工作。

https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API

© www.soinside.com 2019 - 2024. All rights reserved.