Применение ограничений к звуковой дорожке из getUserMedia - PullRequest
2 голосов
/ 26 марта 2020

Возможно ли применить ограничения к работающей живой звуковой дорожке? Кажется, это не работает для меня, по крайней мере на Chrome v80.

Предположим, у меня есть поток:

const stream = await navigator.mediaDevices.getUserMedia({
  audio: {
    autoGainControl: true
    channelCount: 2
    echoCancellation: true
    noiseSuppression: true
  },
  video: false
});

Теперь, позже я хочу изменить некоторые из них. параметры:

for (const track of stream.getAudioTracks()) {
  track.applyConstraints({
    autoGainControl: false,
    echoCancellation: false,
    noiseSuppression: false
  });
}

Это не имеет никакого эффекта. Если я позвоню track.getConstraints(), я увижу новые ограничения, но они не будут слышны, пока я не перезагружу страницу и не применю их с самого начала. Кроме того, когда я вызываю track.getSettings(), я вижу, что мои новые ограничения не были применены .

Я также пытался вызвать track.enabled = false перед применением ограничений, с track.enabled = true потом безуспешно.

Любые советы о том, как заставить это работать, не звоня по бесплатному sh номеру getUserMedia()?

1 Ответ

3 голосов
/ 27 марта 2020

SO user jib , который работает на Firefox и адаптере. js projects написали сообщение в блоге в 2017 году об этой точной функции.

Здесь вот как они применили ограничения к дорожке:

async function apply(c) {
  await track.applyConstraints(Object.assign(track.getSettings(), c));
  update();
}

c - это объект с конкретными добавляемыми ограничениями.

Они делают это так, потому что все свойства, которые пропускается при передаче словаря MediaTrackConstraints , который будет сброшен до значений по умолчанию, когда применен .

Теперь, ваше решение должно работать и для заданных вами свойств.


Поэтому, используя эту скрипку, я попробовал несколько UA, установленных на моем компьютере с macOS:

Chrome

Как вы сообщали, настройки не применяются .

Вот проблема , отслеживающая предстоящую реализацию.

Из комментариев этого выпуска вы также можете найти обходной путь, который подразумевает запрос нового MediaStream из того же deviceId как тот, который вы получили, и применяя т Он желал ограничений.

Вот вилка скрипки стрелы с таким обходным путем. Обратите внимание, что deviceId получено из track.getSettings()

async function apply(c) {
  track.stop(); // required
  const new_constraints = Object.assign(track.getSettings(), c, );
  const new_stream = await gUM({ audio: new_constraints });

  updateSpectrum( audio.srcObject = new_stream );
  track = new_stream.getAudioTracks()[0];
  update();
}

Firefox

Работает без проблем.

Safari

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

Разветвленная скрипка, которую мы сделали для Chrome, по крайней мере, не обрабатывает sh, но это Кажется, что не производит никаких слышимых изменений ...

...