Изменить частоту дискретизации 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, но безуспешно.

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

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


person f.lorenzo    schedule 04.05.2015    source источник


Ответы (7)


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

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

Однако, если вы хотите взять свой аудиопоток, пересчитать его, а затем отправить его на бэкэнд (или сделать что-то еще с ним за пределами 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
    }
person basilikum    schedule 04.05.2015
comment
Спасибо, но, к сожалению, пересэмплированная версия записи не сработала. Но это хороший ответ для других людей, которые ищут способ конвертировать sampleRates - person f.lorenzo; 04.05.2015
comment
Хорошо, тогда просто из любопытства: что вы хотите делать со своим аудиопотоком? Хочешь как-то спасти или какова твоя цель? - person basilikum; 04.05.2015
comment
К сожалению, я не могу сказать вам цель этого из-за политики компании. Но правильный sampleRate является обязательным. - person f.lorenzo; 04.05.2015
comment
Хорошо я понял. Что ж, если у вас есть контроль над средой (браузер, ОС), в которой используется ваше приложение, то, возможно, вы можете изменить частоту дискретизации по умолчанию для вашего аудиоустройства прямо там. - person basilikum; 04.05.2015
comment
Аудиоконтекст принимает частоту дискретизации устройства вывода, а не устройства ввода. источник. - person Octavian Naicu; 13.07.2018
comment
@basilikum хорошее замечание. У меня такая же потребность. В моем случае я отправляю аудиозапись на сервер (приложение - голосовой бот). В моих тестах я испытываю подачу входного аудиоустройства 32 бит / 48 кГц, и я хотел бы уменьшить до 8/16 8/16 кГц (достаточно для голосового сообщения), чтобы уменьшить бесполезную пропускную способность сети при обмене аудиоданными клиент / сервер (через socketio). СТРАННОЕ поведение, которое я испытываю, заключается в том, что getUserMedia, похоже, не принимает никаких ограничений бит / скорости звука: stackoverflow.com/questions/62392352/ - person Giorgio Robino; 17.06.2020

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

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

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

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

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

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

person Timmmm    schedule 13.04.2016

audioContext = new AudioContext({sampleRate: 48000})

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

person Hassam    schedule 17.12.2019
comment
Не работает в Firefox с 2021 года. - person Quan To; 12.04.2021

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

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

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

person Sean    schedule 08.06.2019

ПРИМЕЧАНИЕ. Этот ответ устарел.


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

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

person Brad    schedule 04.05.2015
comment
Понятно, спасибо. Может быть, есть флэш-решение, поддерживающее 48 кГц? (Неважно, если какое-то оборудование его не поддерживает) - person f.lorenzo; 04.05.2015
comment
@ f.lorenzo Может быть. Для этого вам следует опубликовать другой вопрос, поскольку ответ Flash полностью отличается от ответа Web Audio API. - person Brad; 04.05.2015

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

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

person Guillaume Belrose    schedule 19.07.2016

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

person Julien    schedule 13.07.2017