HTML5中的音频数据流传输

17

我正在从服务器以小块接收PCM音频数据并将它们存储在一个数组中。现在,我希望使用一些HTML5功能以无间断地按顺序播放这些音频数据块。我正在考虑两个'可能'的解决方案:

  1. 使用Data URI的HTML5音频标签
  2. Web音频API

虽然我正在调查这些选项,请建议其他选项或对我所看到的两个选项提出意见。尽管跨平台解决方案是最好的,但我可以接受只适用于Chrome的解决方案。

2个回答

21

安排音频是Web Audio API的设计目的。如果您拥有已解码的PCM音频块作为类型化数组(AUDIO_CHUNKS),则可以为每个块创建音频缓冲区,并使用noteOn()在准确的时间(一个接一个)安排它们。类似于:

var startTime = 0;

for (var i = 0, audioChunk; audioChunk = AUDIO_CHUNKS[i]; ++i) {
  // Create/set audio buffer for each chunk
  var audioBuffer = audioCtx.createBuffer(NUM_CHANNELS, NUM_SAMPLES, SAMPLE_RATE);
  audioBuffer.getChannelData(0).set(audioChunk);

  var source = audioCtx.createBufferSource();
  source.buffer = audioBuffer;
  source.noteOn(startTime);
  source.connect(audioCtx.destination);

  startTime += audioBuffer.duration;
}

2
选项一可能行不通,因为音频标签不能播放原始音频数据(我假设你所说的是PCM音频数据,或者我错了吗?)。每个浏览器都需要特定的编解码器。而且音频标签根本不可靠,无法无缝播放东西。
选项二可能有效。Web Audio API 包含缓冲区,可以用原始数据填充并播放,但我从来没有尝试过这样做。现在的一个大缺点是:a. 只能在Chrome上使用;b. 用户需要通过输入about:flags并启用Web Audio来配置Chrome,这可能会让一些用户感到害怕。
第三个选项是Audio Data API,这是一个折中方案。我自己从未尝试过,但从规范上看,它似乎正是你要找的东西。不过,我不知道有关实现方面的情况,所以你需要自己进行一些研究 :) https://wiki.mozilla.org/Audio_Data_API#Writing_Audio 请注意,我是凭空给出这些答案的,而且我对HTML5音频仍然相当陌生。

1
你关于不播放原始PCM的说法有一定道理,但WAV文件只是一个非常薄的包装,用于封装原始音频(其中“包装”指44字节的头文件)。虽然这种方法经常被使用,但现在,当然,两年后,Web音频API似乎是更好的选择。 - Douglas Bagnall
1
你好,使用音频 API 可以播放、开始、停止和更改当前音频时间吗? - B''H Bi'ezras -- Boruch Hashem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接