Web Audio API - 仅在 IOS 上解码 mp3 块时出现“EncodingError:解码失败”

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

我正在通过套接字 io 将第三方生成的 mp3 块传输到浏览器。

音频格式为 mp3,采样率为 44.1kHz,192kbps。

我使用标准化音频上下文(https://github.com/chrisguttandin/standardized-audio-context)来实现广泛的兼容性。

第一个块一到达我就开始播放——它比其他块大一点,并且它是一个有效的 mp3,可以自行解码。后续块不是可以通过浏览器中的decodeAudioData() 解码的有效mp3 文件,即它们不完全在mp3 的内部块边界处开始和结束。

在服务器上任意连接第 3 方生成的块,而不注意 mp3 的内部块边界,并因此流式传输更大的块(例如 50 个小块的组),在 Windows 上播放音频时似乎可以正常工作,但不适用于 IOS。我想decodeAudioData()的内部实现是不同的。

如何将接收到的 mp3 块转换为可以在 IOS 上解码的有效块?或者你会如何处理这个问题?目标是将 AI 生成的实时音频流式传输到浏览器。

以下 StackOverflow 线程不是我的,但我相信那里的答案触及了问题: WebAudioAPIdecodeAudioData() 在 iOS 14 Safari 上给出 null 错误

javascript audio-streaming web-audio-api audiocontext
1个回答
0
投票

是的,基本上通过任意切割流,您正在创建无效的 MP3 流,并且不同的解码器对此有不同程度的容忍度。 特别是

decodeAudioData()
期望正确的数据,而使用像
<audio>
这样的普通媒体元素可以更宽容。

无论如何,请跳过整个方法并使用常规 HTTP。 通过采用 Web Socket 路线,您只是在不需要时添加开销和依赖项。 如果你只使用 HTTP(S),你可以这样做:

<audio src="https://example.com/your-stream"></audio>

或者...

const audio = new Audio('https://example.com/your-stream');
audio.play();

浏览器将为您处理所有缓冲逻辑和一切,您可以开始构建您的应用程序。

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