Webaudio api: изменить частоту дискретизации

Можно ли изменить частоту дискретизации записанного волнового файла без использования стороннего ПО и веб-сайтов, а также в js? Если в Recorder.js выставить частоту 44100

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

записывается с той же частотой, и если вы уменьшите ее до 22050, длина файла будет в 2 раза больше записанного и будет медленно воспроизводиться, при увеличении скорости воспроизведения запись будет звучать нормально. Собственно вопрос, будет ли можно изменить частоту дискретизации уже содержащихся файлов и как это сделать?


person user2887621    schedule 16.10.2013    source источник


Ответы (2)


Единственный способ, который я нашел до сих пор, - это небольшая библиотека передискретизации xaudio.js, часть библиотеки speex.js. Работает неплохо. Я использую его для преобразования звука из собственного формата в моно 8 кГц.

person Michaela.Merz    schedule 20.12.2013
comment
Можете ли вы предоставить более подробную информацию (например, фрагмент кода) с помощью xaudio.js? Также какой у него алгоритм передискретизации, насколько качественны результаты? - person nafg; 23.10.2014

Для всех, кто интересуется ... Поскольку типизированные массивы можно передавать, вы можете отправить их веб-воркеру и вниз по образцу, а затем отправить обратно или на сервер, или куда-нибудь еще.

//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); });
}

Веб-воркер примерно такой. Если вы хотите отправить его на сервер, используйте веб-сокет. В противном случае используйте почтовое сообщение для передачи данных обратно клиенту. Вам также необходимо добавить клиентскую сторону прослушивателя событий, поэтому найдите "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);
person Seph Reed    schedule 30.07.2017