#javascript #webrtc #blazor
#javascript #webrtc #blazor
Вопрос:
Я разрабатываю приложение на Blazor / HTML / JavaScript. Я пытаюсь подключить веб-камеру пользователя к потоку, к которому я могу получить доступ по идентификатору, потому что это серверное приложение, и запрос отправляется, затем, когда пользователь разрешает, выдается обратный вызов. Поэтому я не могу использовать
.then(function (stream) {
vid.srcObject = stream;
})
поскольку на данный момент видеоэлемент не существует, и сервер должен его создать, поэтому мне нужно «задержать» этот поток там на несколько мгновений, пока сервер не сможет создать для него видеоэлемент. Я пытался создать BlobURL, но события видеоэлемента никогда не срабатывают, или я получаю ошибки, такие как «Медиа-ресурс, указанный атрибутом src или назначенным объектом поставщика мультимедиа, не подходит».
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
if (navigator.getUserMedia) {
var video = document.getElementById("video1");
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(function (stream) {
console.log("got stream =" stream);
return stream;
})
.then(stream => new Response(stream))
.then(response => response.blob())
.then(blob => window.URL.createObjectURL(blob))
.then(function (url) {
console.log("got url =" url);
var vid = document.getElementById("video1");
vid.src = url; // No errors, onloadstart only, no other events
vid.load();
vid.oncanplay = function (e) {
console.log("oncanplay"); // Does not fire
};
vid.onloadstart = function (e) {
console.log("onloadstart"); // Fires but thats it
};
vid.onloadedmetadata = function (e) {
console.log("onloadedmetadata"); // Does not fire
};
document.getElementById("video1").oncanplaythrough = function (e) {
console.log("oncanplaythrough"); // Does not fire
};
document.getElementById("video1").onloadeddata = function (e) {
console.log("onloadeddata"); // Does not fire
// vid.play();
};
})
.catch(function (err) {
console.log("got error =" err);
return err;
});
}
Поскольку эти видеоэлементы создаются динамически, я должен заставить его работать с потоком или URL-адресом большого двоичного объекта, потому что сервер обрабатывает все. (Способ Блейзора).
Комментарии:
1. Это очень непонятно, почему вы можете просто сохранить переменную
stream
так же, как вы бы удерживали blob:// URI. Второй фрагмент также ничего не ожидает от сервера.2. Во 2-м фрагменте приведен пример того, что присвоение URL-адреса большого двоичного объекта видео не работает, даже если задержки нет. Blazor не использует javascript, а элемент video является ссылкой на сервер, созданной после предоставления пользователем разрешения. URL-адрес будет передан на сервер и назначен вновь созданному видеоэлементу
3. Создание большого двоичного объекта:// URI из MediaStream устарело уже несколько лет. Правильный способ передать видеоэлемент с помощью медиапотока — установить его в качестве
srcObject
атрибута. Но, несмотря на то, что он все еще поддерживался, большой двоичный объект:// URI доступен только для экземпляра, который его создал (т.Е. Браузер). Передача большого двоичного объекта:// URI на сервер бесполезна. Но, хотя я не знаю blazor, я почти уверен, что этот видеоэлемент отображается браузером в конце дня. Вот где вам нужно передать mediastream как srcObject.