2013-10-16 98 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);