Webaudio api:更改采样率

时间:2013-10-16 18:36:44

标签: audio-recording web-audio

是否可以在不使用第三方软件和网站的情况下更改录制的波形文件的采样率? 如果recorder.js设置频率为44100

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

以相同的频率写入,如果将其缩小为22050,则文件的长度将是录制的2倍,并且再现速度慢,同时提高播放速度,录制效果会很好。实际上是否可以更改采样率已包含文件以及如何进行操作的问题?

2 个答案:

答案 0 :(得分:1)

我到目前为止找到的唯一方法是一个小的重采样库xaudio.js,它是speex.js库的一部分。工作得很好。我用它将音频从原生格式转换为8Khz Mono。

答案 1 :(得分:0)

对于任何感兴趣的人...因为类型化数组是可转换的,您可以将它们发送给Web工作者,然后下传,然后将其发送回服务器或任何地方。

//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。否则,使用post message将数据传输回客户端。您还需要添加一个事件监听器客户端,因此搜索" 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);
相关问题