Изменить частоту дискретизации AudioContext (getUserMedia)

Я пытаюсь записать 48000 Гц записи через getUserMedia. Но без удачи. Возвращенный звук MediaStream возвращает 44100 Гц. Как я могу установить это на 48000 Гц?

Вот фрагменты моего кода:

var startUsermedia = this.startUsermedia;

            navigator.getUserMedia({ 
                audio: true, 
                //sampleRate: 48000 
            }, startUsermedia, function (e) {
                console.log('No live audio input: ' + e);
            });

Функция startUsermedia:

startUsermedia: function (stream) {
            var input = audio_context.createMediaStreamSource(stream);
            console.log('Media stream created.');
            // Uncomment if you want the audio to feedback directly
            //input.connect(audio_context.destination);
            //__log('Input connected to audio context destination.');

            recorder = new Recorder(input);
            console.log('Recorder initialised.');
        },

Я попытался изменить свойство sampleRate для AudioContext, но безуспешно.

Как я могу изменить sampleRate до 48000 Гц?

РЕДАКТИРОВАТЬ: Мы также теперь в порядке с флэш-решение, которое может записывать и экспортировать файлы WAV на 48000 Гц

5 ответов

Насколько я знаю, нет способа изменить частоту дискретизации в аудио контексте. Частота дискретизации обычно будет частотой дискретизации вашего записывающего устройства и останется неизменной. Таким образом, вы не сможете написать что-то вроде этого:

var input = audio_context.createMediaStreamSource(stream);
var resampler = new Resampler(44100, 48000);
input.connect(resampler);
resampler.connect(audio_context.destination);

Однако, если вы хотите взять свой аудиопоток, повторно сэмплировать его и затем отправить его на сервер (или сделать что-то еще с ним вне Web Audio API), вы можете использовать внешний преобразователь частоты дискретизации (например, https://github.com/taisel/XAudioJS/blob/master/resampler.js).

   var resampler = new Resampler(44100, 48000, 1, 2229);

   function startUsermedia(stream) {
        var input = audio_context.createMediaStreamSource(stream);
        console.log('Media stream created.');


        recorder = audio_context.createScriptProcessor(2048);
        recorder.onaudioprocess = recorderProcess;
        recorder.connect(audio_context.destination);
    }

    function recorderProcess(e) {
        var buffer = e.inputBuffer.getChannelData(0);
        var resampled = resampler.resampler(buffer);
        //--> do sth with the resampled data for instance send to server
    }

Похоже, есть открытая ошибка о невозможности установить частоту дискретизации:

https://github.com/WebAudio/web-audio-api/issues/300

Также есть проблема Chrome:

https://bugs.chromium.org/p/chromium/issues/detail?id=432248

Я проверил последний код Chromium, и там нет ничего, что позволяло бы вам устанавливать частоту дискретизации.

audioContext = new AudioContext({sampleRate: 48000})

Просто установите частоту дискретизации при создании объекта AudioContext, это сработало для меня

Ты не можешь Частота дискретизации AudioContext устанавливается браузером / устройством, и вы ничего не можете сделать, чтобы изменить его. Фактически, вы обнаружите, что 44,1 кГц на вашей машине могут быть 48 кГц на моей. Это зависит от того, что ОС выбирает по умолчанию.

Также помните, что не все аппаратные средства способны к любой частоте дискретизации.

Он был добавлен в хром:

var ctx = new (window.AudioContext || window.webkitAudioContext)({sampleRate:16000});

https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext

Вы можете использовать OfflineAudioContext для рендеринга аудио-буфера с другой частотой дискретизации (но это пакетная операция).

Таким образом, вы записали бы свою запись, используя обычный звуковой контекст, а затем использовали бы OfflineAudioContext с другой частотой дискретизации для визуализации вашего буфера. На странице Mozilla есть пример.

Это сейчас в спецификации, но еще не реализовано в Chromium. Также в bugs.chromium.org "Статус: Доступен" не означает, что он реализован. Это просто означает, что никто не работает над этим и что он доступен для всех, кто хочет работать над этим. Таким образом, "Доступен" означает "Не назначен".

Другие вопросы по тегам