Применение ограничений к звуковой дорожке из getUserMedia

Можно ли применить ограничения к работающей звуковой дорожке в реальном времени? У меня это не работает, по крайней мере, на 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, но безуспешно.

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


person Brad    schedule 26.03.2020    source источник


Ответы (1)


Пользователь SO jib, который работает с проектами Firefox и adapter.js, написал запись в блоге в 2017 году именно об этой функции.

Вот как они применяли ограничения к треку:

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

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

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

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


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

Хром

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

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

Из комментариев к этой проблеме вы также можете найти обходной путь, который подразумевает запрос нового 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();
}

Fire Fox

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

Сафари

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

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

person Kaiido    schedule 27.03.2020
comment
Как всегда спасибо @Kaiido. Кажется, вы всегда можете найти ошибки Chrome для всех новых вещей, которые я пытаюсь использовать. :-) - person Brad; 27.03.2020