MediaStream Необработанный отказ от обещания: [объект DOMError] (в Safari 11)

Я получаю необработанное отклонение обещания в Safari Tech Preview 11 в моем методе ниже для инициализации WebRTC. В частности, это происходит, когда я назначаю MediaStream к элементу видео, как это: video.srcObject = event.stream; - трассировка стека показывает, что эта строка вызвала исключение. Я не смог поймать исключение, используя try/catch.

Исключение происходит только в Safari 11 (не происходит в Chrome).

Вот метод:

initWebRTC(p){
    var self = this;
    return new Promise((resolve, reject) => {

      self.state.connection = new RTCMultiConnection();
      self.state.connection.socketMessageEvent = 'webrtc-firebase';
      self.state.connection.setCustomSocketHandler(FirebaseConnection);
      self.state.connection.firebase = 'webrtc-firebase'; 
      self.state.connection.enableFileSharing = true; 
      self.state.connection.session = {
        audio: true,
        video: true,
        data: true
      };
      self.state.connection.sdpConstraints.mandatory = {
        OfferToReceiveAudio: true,
        OfferToReceiveVideo: true
      };
      self.state.connection.onstream = function(event) {
          console.log('event.mediaElement',event.mediaElement);
          console.log('event.stream',event.stream);

          var videoContainer = document.getElementById('videoContainer');
          var video = event.mediaElement;
          if (!window.safari){
            var source = document.createElement("source");
            source.srcObject = event.stream;
            video.appendChild(source);
          } else { // Safari
            try{
              video.srcObject = event.stream; // this is the line that throws the exception
            }catch(e){ //unable to catch the exception
              console.log('exception',e);
            }
          }
          videoContainer.appendChild(video);

          var playPromise = video.play();
          if (playPromise !== undefined) { // not a Promise in some browsers
            playPromise.catch(function(error) {
            });
          }
          setTimeout(function() {
            var playPromise = video.play();
            if (playPromise !== undefined) {
              playPromise.catch(function(error) {
              });
            }
          }, 5000);
      };
      resolve();
    });
  }

Не уверен, что это поможет, но вот след:

[Error] Unhandled Promise Rejection: [object DOMError]
    (anonymous function)
    rejectPromise
    onstream (index.js:5787) // this is the video.srcObject = event.stream; line
    (anonymous function) (RTCMultiConnection.js:4092)
    getRMCMediaElement (RTCMultiConnection.js:1113)
    onGettingLocalMedia (RTCMultiConnection.js:4064)
    onGettingLocalMedia (RTCMultiConnection.js:4984)
    streaming (RTCMultiConnection.js:3289)
    (anonymous function) (RTCMultiConnection.js:3358)
    promiseReactionJob

Любая помощь будет оценена. Спасибо!

2 ответа

Я не знаю, может ли это сработать для вас, но у меня была похожая проблема, исправление было добавить атрибут 'muted' к тегу video, после этого все снова работает, надеюсь, это поможет.

Safari 11 блокирует автоматическое воспроизведение любого видео со звуком по умолчанию ( источник).

Я верю video Элемент поставляется с атрибутом autoplay. Когда вы установите srcObject к нему он будет пытаться воспроизвести видео - а затем заблокирован Safari. Вот почему вы видите ошибку.

Вы можете попробовать удалить autoplay из элемента видео, то вы можете поймать его в playPromise.catch,

Другие вопросы по тегам