Изменить частоту выборки 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" не означает, что он реализован. Это просто означает, что никто не работает над этим и что он доступен для всех, кто хочет работать над ним. Таким образом, "Доступный" означает "Не назначено".
Ответ 6
он был добавлен в Chrome:
var ctx = new (window.AudioContext || window.webkitAudioContext) ({sampleRate: 16000});
https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext