HTML5 Audio API inputBuffer.getChannelData to audio Array buffer

时间:2014-09-10 21:54:17

标签: javascript html5 audio web-audio arraybuffer

我正在创建一个应用程序,我从inputBuffer获取mic数据,我想要流式传输到另一个客户端并播放它。但是,我无法忍受它。

我的录制/捕获工作正常,所以我将跳到代码的相关部分

function recorderProcess(e) {
   var left = e.inputBuffer.getChannelData(0);
    var convert =  convertFloat32ToInt16(left); 
    window.stream.write(convert);

  var src = window.URL.createObjectURL(lcm);
  playsound(convert);
ss(socket).emit('file',convert, {size: src.size},currentgame);
ss.createBlobReadStream(convert).pipe(window.stream);
//ss.createReadStream(f).pipe(widnow.stream);

}



 function playsound(raw) {
   console.log("now playing a sound, that starts with", new Uint8Array(raw.slice(0, 10)));
    context.decodeAudioData(raw, function (buffer) {
    if (!buffer) {
        console.error("failed to decode:", "buffer null");
        return;
    }
    var source = context.createBufferSource();
    source.buffer = buffer;
    source.connect(context.destination);
    source.start(0);
    console.log("started...");
   }, function (error) {
      console.error("failed to decode:", error);
   });
   }

我能够使用float32toint16函数成功创建一个数组缓冲区,但是当我使用init声音函数时,我得到一个错误" null"意味着arraybuffer不会解码为音频流?其他人遇到过这个问题吗?我已经搜索了互联网,没有回答如何做到这一点。我试图这样玩,因为最终我将从客户端流向客户端,所以我将通过套接字发送阵列。

提前感谢。

2 个答案:

答案 0 :(得分:2)

如果我正确理解了这一点(代码示例中有一些缺失部分)......

decodeAudioData只能解码MP3或WAV等内容。看起来您正在传递原始Int16ArrayUint16Array。由于基础ArrayBuffer不是decodeAudioData理解的格式,因此它会放弃。

我认为你想要做的是这样的事情:

function playsound( raw ) {
  // i'll assume you know how to convert in this direction
  // since you have convertFloat32ToInt16
  var buffer = convertInt16ToFloat32( raw ),
    src = context.createBufferSource(),
    audioBuffer = context.createBuffer( 1, buffer.length, context.sampleRate );
  audioBuffer.getChannelData( 0 ).set( buffer );
  src.buffer = audioBuffer;
  src.connect( context.destination );
  src.start( 0 );
}

基本上,您已经有办法创建Web Audio API喜欢的原始Float32Array,因此无需解码(并且无法解码,因为您的数据不是有效的文件格式)。因此,您只需转换回Float32Array,创建自己的AudioBuffer,写入buffer的数据,然后从那里开始。

答案 1 :(得分:1)

为了从float32转换为unsigned int 16,可以将每个float32值与0xffff(最大值为16位)相乘。并且对于int16到float32,这反过来意味着除以0xffff。音频应该没问题了。

我是stackoverflow的新手。我应该把它写成评论,但由于缺乏声誉,我不能。这就是为什么我必须把它写成答案。很抱歉给您带来不便。