2013-10-16 97 views
1

是否可以在不使用第三方軟件和網站的情況下更改記錄的波形文件的採樣率,以及在js中? 如果recorder.js設置的44100Webaudio api:更改採樣率

worker.postMessage ({ 
      command: 'init', 
      config: { 
        sampleRate: 44100 
      } 
}) ; 

頻率寫有相同的頻率,如果你將其降低到22050,該文件的長度將是2倍以上的記錄將是緩慢的重現,同時提高播放速度,錄音聽起來會很好。實際上是否有可能改變採樣率已經包含文件以及如何操作?

回答

1

我到目前爲止發現的唯一方法是一個小的resample庫xaudio.js,它是speex.js庫的一部分。工作很好。我用它將原生格式的音頻轉換爲8Khz單聲道。

+0

您可以使用xaudio.js提供更多細節(如代碼片段)嗎?也有什麼樣的重採樣算法,結果有多高質量? – nafg

0

對於任何感興趣的人...因爲類型化數組是可轉移的,所以您可以將它們發送給網絡工作者,然後將其發回給服務器或任何地方。

//get audio from user and send it to a web worker 
function recordUser(argument) { 
     // 
    var audioCtx = new AudioContext(); 
    var worker = new Worker('downsampler.js'); 


    // Create a ScriptProcessorNode with a bufferSize of 512 and a single input and no output channel 
    var scriptNode = audioCtx.createScriptProcessor(512, 1, 0); 
    console.log(scriptNode.bufferSize); 

    // Give the node a function to process audio events 
    scriptNode.onaudioprocess = function(audioProcessingEvent) { 
     var inputBuffer = audioProcessingEvent.inputBuffer; 
     console.log(inputBuffer.getChannelData(0)); 
     worker.postMessage(inputBuffer.getChannelData(0)); 
    } 


    navigator.mediaDevices.getUserMedia({ audio: true }) 
    .then(function(mediaStream) { 
     var mediaStreamSource = audioCtx.createMediaStreamSource(mediaStream); 
     mediaStreamSource.connect(scriptNode); 
    }) 
    .catch(function(err) { console.log(err.name + ": " + err.message); }); 
} 

網絡工作者是這樣的。如果您想將其發送到服務器,請使用websocket。否則,請使用發佈消息將數據傳輸回客戶端。您還需要添加一個事件偵聽器客戶端,因此,請搜索「mdn WebWorker」以閱讀它。

//example worker that sends the data to both a web socket and back to the user 
var ws = new WebSocket('ws://localhost:4321'); 
ws.binaryType = 'arraybuffer'; 

self.addEventListener('message', function(e) { 
    var data = e.data; 


    var sendMe = new Float32Array(data.length/16); 
    for(var i = 0; i * 16 < data.length; i++) { 
     sendMe[i] = data[i*16]; 
    } 


    //send to server 
    ws.send(sendMe); 

    //or send back to user 
    self.postMessage(sendMe) 

}, false);