到目前爲止,我想出瞭如何使用T("rec")
記錄器。但如何將timbre.js緩衝區導出爲wav或任何其他音頻文件格式?如何將timbre.js緩衝區導出爲.wav或其他任何音頻文件格式?
var rec = T("rec", {timeout:1000}, t).on("ended", function(buffer) {
// export buffer?
});
到目前爲止,我想出瞭如何使用T("rec")
記錄器。但如何將timbre.js緩衝區導出爲wav或任何其他音頻文件格式?如何將timbre.js緩衝區導出爲.wav或其他任何音頻文件格式?
var rec = T("rec", {timeout:1000}, t).on("ended", function(buffer) {
// export buffer?
});
您可以檢查,如果這個工程,
我剛剛修改了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
看起來不錯,但代碼產生一個空的wav。然而,波形文件是有效的,這是一個好兆頭。我在http://jsfiddle.net/cru4xjsb/1/上創建了一個js小提琴,其代碼基於音色api演示。 – 2015-03-02 09:42:41
我已經改變了'''buf = buffer.buffer''到'''buf = buffer.buffer [0]''',現在它應該可以工作 – mido 2015-03-02 09:51:16
令人印象深刻的知識! – 2015-03-02 09:57:53
你試過https://github.com/mattdiamond/Recorderjs,你能給我說說緩衝區的一些細節? – mido 2015-03-02 07:38:06
是的,我發現這個庫,但我認爲緩衝區需要轉換。在http://mohayonao.github.io/timbre.js/soundbuffer.html沒有太多的信息。我只是開始使用網絡音頻,所以到目前爲止我不知道如何在timbreJs上使用recorderJs。 – 2015-03-02 07:49:38