4

我在下面初始化 WebRTC 的方法中在 Safari Tech Preview 11 中收到未处理的承诺拒绝。具体来说,当我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

任何帮助,将不胜感激。谢谢!

4

2 回答 2

2

默认情况下,Safari 11 会阻止自动播放任何带声音的视频(source)。

我相信该video元素带有 autoplay 属性。当您设置srcObject它时,它会尝试播放视频 - 然后被 Safari 阻止。这就是您看到错误的原因。

您可以尝试autoplay从视频元素中删除,然后您可以在playPromise.catch.

于 2017-08-04T14:25:16.303 回答
2

我不知道这是否对您有用,但我遇到了类似的问题,修复方法是将“静音”属性添加到视频标签,之后一切正常,希望对您有所帮助。

于 2017-10-13T19:43:37.433 回答