WebRTC - отключить всю обработку звука
Я сейчас пытаюсь получить как можно более чистый аудио канал через webrtc. С помощью объекта mediaconstraints getUserMedia я установил следующие параметры:
constraints: {
audio: {
mandatory: {
echoCancellation: false,
googEchoCancellation: false,
googAutoGainControl: false,
googAutoGainControl2: false,
googNoiseSuppression: false,
googHighpassFilter: false,
googTypingNoiseDetection: false,
//googAudioMirroring: false // For some reason setting googAudioMirroring causes a navigator.getUserMedia error: NavigatorUserMediaError
}
},
video: false
},
Это значительно улучшает качество звука, но, похоже, все еще присутствует обработка звука, которая вызывает искажение звука в виде высокочастотного шума в некоторых тестовых образцах.
Есть флаг Chrome --use-file-for-fake-audio-capture
как описано в http://peter.sh/experiments/chromium-command-line-switches/, который позволяет вводить данные из файла для тестирования. Как упомянуто в описании флага, вся обработка звука должна быть отключена, иначе звук будет искажен - так что, похоже, для этого есть дополнительные опции.
Я также попробовал --disable-audio-track-processing --audio-buffer-size=16 --enable-exclusive-audio
Флаги Chrome, но все же, кажется, есть некоторая обработка звука.
Есть ли способ отключить все еще присутствующую обработку звука (желательно через JS API)?
1 ответ
Это обновленный способ отключить обработку звука и получить чистый сигнал:
navigator.mediaDevices.getUserMedia({
audio: {
autoGainControl: false,
channelCount: 2,
echoCancellation: false,
latency: 0,
noiseSuppression: false,
sampleRate: 48000,
sampleSize: 16,
volume: 1.0
}
});
Кроме того, убедитесь, что в вашем SDP есть stereo
а также maxaveragebitrate
параметры:
a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000
Держу пари, что переменное поведение битрейта (по умолчанию) кодека opus вызывает некоторое сжатие или корректировку. Вы можете вручную изменить предложение SDP, чтобы использовать CBR (постоянный битрейт) вместо VBR (переменный битрейт). Когда вы получите предложение SDP из браузера, измените строку:
a=fmtp:111 minptime=10; useinbandfec=1
чтобы:
a=fmtp:111 minptime=10; cbr=1
Обратите внимание, что я оба добавляю cbr=1
и удаление useinbandfec=1
, Я не уверен, что падение useinbandfec
необходимо, но кажется, что внутриполосный FEC (коррекция ошибок пересылки) вызывает настройку сжатия, которую вы также хотели бы избежать.