Изменить частоту выборки AudioContext (getUserMedia)

Im пытается записать запись 48000Hz через 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 Гц

Ответы

Ответ 1

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

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
    }

Ответ 2

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

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

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

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

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

Изменение: похоже, что это было реализовано в Chrome, но в настоящее время не работает - см. Комментарии в выпуске Chromium.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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