У меня есть веб-интерфейс, который может получать MediaStream с удаленного RTCPeerConnection.

Получив этот stream, я передаю его тегу <video> с установленным autoPlay.

(Примечание: интерфейс находится в React, поэтому мы передаем поток как srcObject с ref.)

В Firefox все работает нормально.

В Chrome видео отображается только в том случае, если я делаю это при запуске приложения:

  • вызовите navigator.mediaDevices.getUserMedia({ ... }), если для audio или video установлено значение true
  • возьмите MediaStream, возвращаемый getUserMedia, и сохраните его в глобальной переменной или переменной верхнего уровня

Для меня это не имеет никакого смысла, поскольку:

  • Я не хочу спрашивать у пользователей разрешение на доступ к их микрофону или веб-камере, чтобы показать видео.
  • Это происходит только в Chrome, и Firefox работает нормально.
  • Это происходит как в "общедоступных" доменах localhost, так и https://, поэтому, вероятно, это не проблема безопасности.
  • Похоже, на это не влияет игра с атрибутами autoPlay, controls и т. Д. Тега <video>.

Что-нибудь очевидное, что мне здесь не хватает?

0
phtrivier 12 Дек 2019 в 20:28

1 ответ

Chrome ввел ограничения на автозапуск в 2018 году. Они не действуют, когда активен getUserMedia. Если логика вашего приложения работает, когда Chrome запускается с параметром --autoplay-policy = no-user-gesture-required, это говорит о том, что это так. В статье также есть некоторая справочная информация и возможные обходные пути, такие как введение пользовательского жеста.

(и нет, эти ограничения не имеют смысла ...)

1
Philipp Hancke 12 Дек 2019 в 23:52
К сожалению, даже --autoplay-policy=... ничего не меняет. Я действительно смущен...
 – 
phtrivier
17 Дек 2019 в 19:19
Вы проверили, устанавливается ли базовое соединение и принимает ли кадры? chrome: // webrtc-internals отобразит это
 – 
Philipp Hancke
17 Дек 2019 в 19:26