Javascript 如何将timbre.js缓冲区导出为.wav或任何其他音频文件格式?

Javascript 如何将timbre.js缓冲区导出为.wav或任何其他音频文件格式?,javascript,web-audio-api,waveform,Javascript,Web Audio Api,Waveform,到目前为止,我知道了如何使用T(“rec”)Recorder。但如何将timbre.js缓冲区导出为wav或任何其他音频文件格式 var rec = T("rec", {timeout:1000}, t).on("ended", function(buffer) { // export buffer? }); 你能检查一下这是否有效吗, 我刚刚修改了,将其改为单通道,并删除了工作位 var rec = T("rec", {timeout:1000}, t).on("ended",

到目前为止,我知道了如何使用
T(“rec”)
Recorder。但如何将timbre.js缓冲区导出为wav或任何其他音频文件格式

var rec = T("rec", {timeout:1000}, t).on("ended", function(buffer) {
  // export buffer?
});

你能检查一下这是否有效吗,
我刚刚修改了,将其改为单通道,并删除了工作位

    var rec = T("rec", {timeout:1000}, t).on("ended", function(buffer) {
      // export buffer?

      // I am assuming that buffer is of format {buffer: bufferArray, samplerate: samplerate}


      var buf = buffer.buffer[0],      // buf = a Float32Array of data
          sr = buffer.samplerate    //sample rate of the data
      ;

      var dataview = encodeWAV(buf, sr);
      var audioBlob = new Blob([dataview], { type: 'audio/wav' });

      // do something with audioBlob, may be provide it as link to be downloaded
    });


    function encodeWAV(buf, sr){
      var buffer = new ArrayBuffer(44 + buf.length * 2);
      var view = new DataView(buffer);

      /* RIFF identifier */
      writeString(view, 0, 'RIFF');
      /* chunk size (= file length - 8) */
      view.setUint32(4, 36 + buf.length * 2, true);
      /* RIFF type */
      writeString(view, 8, 'WAVE');
      /* format chunk identifier */
      writeString(view, 12, 'fmt ');
      /* format chunk length */
      view.setUint32(16, 16, true);
      /* sample format (raw) */
      view.setUint16(20, 1, true);
      /* channel count */
      view.setUint16(22, 1, true);
      /* sample rate */
      view.setUint32(24, sr, true);
      /* byte rate (sample rate * block align) */
      view.setUint32(28, sr *2 , true);
      /* block align (channel count * bytes per sample) */
      view.setUint16(32, 2, true);
      /* bits per sample */
      view.setUint16(34, 16, true);
      /* data chunk identifier */
      writeString(view, 36, 'data');
      /* data chunk length */
      view.setUint32(40, buf.length * 2, true);

      floatTo16BitPCM(view, 44, buf);

      return view;
    }    

    function floatTo16BitPCM(output, offset, input){
      for (var i = 0; i < input.length; i++, offset+=2){
        var s = Math.max(-1, Math.min(1, input[i]));
        output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
      }
    }

    function writeString(view, offset, string){
      for (var i = 0; i < string.length; i++){
        view.setUint8(offset + i, string.charCodeAt(i));
      }
    }
var rec=T(“rec”,{timeout:1000},T).on(“end”,函数(缓冲区){
//出口缓冲区?
//我假设缓冲区的格式为{buffer:bufferArray,samplerate:samplerate}
var buf=buffer.buffer[0],//buf=一个数据数组
sr=buffer.samplerate//数据的采样率
;
var dataview=encodeWAV(buf,sr);
var audioBlob=新Blob([dataview],{type:'audio/wav'});
//用audioBlob做点什么,可以提供链接下载
});
函数编码WAV(buf,sr){
var buffer=新阵列缓冲区(44+buf.length*2);
变量视图=新数据视图(缓冲区);
/*RIFF标识符*/
writeString(视图,0,'RIFF');
/*块大小(=文件长度-8)*/
视图设置32(4,36+buf.length*2,真);
/*裂谷型*/
writeString(视图,8,“波浪”);
/*格式块标识符*/
writeString(视图,12,“fmt”);
/*格式块长度*/
view.setUint32(16,16,true);
/*样本格式(原始)*/
view.setUint16(20,1,true);
/*通道计数*/
view.setUint16(22,1,true);
/*采样率*/
视图。setUint32(24,sr,真);
/*字节率(采样率*块对齐)*/
视图。setUint32(28,sr*2,真);
/*块对齐(通道计数*每个采样字节)*/
view.setUint16(32,2,true);
/*每采样位数*/
view.setUint16(34,16,true);
/*数据块标识符*/
writeString(视图,36,“数据”);
/*数据块长度*/
视图设置32(40,基本长度*2,真值);
浮动至16比特PCM(视图,44,buf);
返回视图;
}    
功能浮动至16比特PCM(输出、偏移、输入){
对于(变量i=0;i

fiddle

你试过了吗,你能给我一些关于缓冲区的细节吗?是的,我找到了这个库,但我认为缓冲区需要转换。网站上没有那么多可用的信息。我刚刚开始使用网络音频,到目前为止,我不知道如何使用recorderJs和timbreJs。看起来不错,但代码生成一个空的wav。然而,wave文件是有效的,这是一个好迹象。我已经用一个基于音色api演示的代码创建了一个js提琴。我已经将,
buf=buffer.buffer
更改为
buf=buffer.buffer[0]
,现在它应该可以工作了!