2015-03-02 57 views
3

到目前爲止,我想出瞭如何使用T("rec")記錄器。但如何將timbre.js緩衝區導出爲wav或任何其他音頻文件格式?如何將timbre.js緩衝區導出爲.wav或其他任何音頻文件格式?

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

你試過https://github.com/mattdiamond/Recorderjs,你能給我說說緩衝區的一些細節? – mido 2015-03-02 07:38:06

+0

是的,我發現這個庫,但我認爲緩衝區需要轉換。在http://mohayonao.github.io/timbre.js/soundbuffer.html沒有太多的信息。我只是開始使用網絡音頻,所以到目前爲止我不知道如何在timbreJs上使用recorderJs。 – 2015-03-02 07:49:38

回答

1

您可以檢查,如果這個工程,
我剛剛修改了source,把它改爲單聲道和刪除工作者位。

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)); 
     } 
    } 

小提琴demo

+0

看起來不錯,但代碼產生一個空的wav。然而,波形文件是有效的,這是一個好兆頭。我在http://jsfiddle.net/cru4xjsb/1/上創建了一個js小提琴,其代碼基於音色api演示。 – 2015-03-02 09:42:41

+0

我已經改變了'''buf = buffer.buffer''到'''buf = buffer.buffer [0]''',現在它應該可以工作 – mido 2015-03-02 09:51:16

+0

令人印象深刻的知識! – 2015-03-02 09:57:53

相關問題