1

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

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

 同频写入,如果降低到22050,文件长度会增加2倍,播放速度会变慢,同时提高播放速度,录音听起来会很好。其实问题是否可以更改已经包含文件的采样率以及如何做到这一点?

4

2 回答 2

1

到目前为止,我发现的唯一方法是一个小型重采样库 xaudio.js,它是speex.js库的一部分。效果很好。我用它将音频从原生格式转换为 8Khz 单声道。

于 2013-12-20T17:45:51.723 回答
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。否则,使用 post 消息将数据传输回客户端。您还需要添加一个事件侦听器客户端,因此请搜索“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);
于 2017-07-30T06:25:34.353 回答