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
,