【问题标题】:Play wav file as bytes received from server播放 wav 文件作为从服务器接收到的字节
【发布时间】:2017-10-19 18:25:19
【问题描述】:

我正在从服务器接收原始数据波形文件,我需要在客户端播放这个字节数组。

我尝试在link 中使用 decodeAudioData,但我得到了错误:

DOMException : 无法解码音频数据。

这是合乎逻辑的,因为我的原始数据不是普通的 mp3 文件,它是一个需要以 8000Hz 速率和 1 个通道和每个样本 16 位播放的波形。

是否有函数可以播放从服务器接收到的字节数组,以一定的速率和通道数

【问题讨论】:

  • 该示例中的函数不是为您做的吗?诚然,从我有限的理解来看,但看起来audioContext.createBuffer(1, numberOfSamples, sampleRate); 可以以您喜欢的任何速率和样本调用?我不认为它不是 MP3 是相关的,因为您链接到的示例已经是关于 WAV 的?
  • 我读到当 decodeAudioData 不知道文件的格式时,会发生无法解码音频数据的异常,它只适用于 mp3 格式。对于我已经阅读过的 createBuffer 方法,我没有找到可以将我的数组放在哪里来播放它,你有一个例子吗?
  • 嗯,在该问题的公认解决方案中(诚然没有使用我提到的 createBuffer 函数)stackoverflow.com/a/24194252/5947043,它声明“我调用 playByteArray 并向其传递一个包含 pcm wav 数据的字节数组。”很明显,可以做到这一点。不过,这个答案已经 5 岁了。首先我们应该使用 AudioContext 而不是 webkitAudioContext。请参阅developer.mozilla.org/en/docs/Web/API/AudioContext - 那里可能有一些关于确切支持的格式、费率等的信息,但在基本级别上支持

标签: javascript html audio


【解决方案1】:

我设法使用这种方法在浏览器上播放字节:

function playWave(byteArray) {
    var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    var myAudioBuffer = audioCtx.createBuffer(1, byteArray.length, 8000);
    var nowBuffering = myAudioBuffer.getChannelData(0);
    for (var i = 0; i < byteArray.length; i++) {
        nowBuffering[i] = byteArray[i];
    }

    var source = audioCtx.createBufferSource();
    source.buffer = myAudioBuffer;
    source.connect(audioCtx.destination);
    source.start();
}

【讨论】:

  • 嗨,迈赫迪。您是按原样从服务器发送波形文件,还是省略标题信息而只发送音频部分?
  • 我根本不使用标题信息,但最近我将方法 myAudioBuffer.getChannelData() 更改为使用 audioCtx.decodeAudioData(data, function() {}) 并且此方法需要数据标头信息,因此我必须在使用 decodeAudioData() 之前构建标头信息(在客户端)
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多