Я пытаюсь транслировать содержимое html5 canvas
в режиме реального времени, используя websockets
и nodejs
.
Содержимое холста html5 - это просто видео.
То, что я сделал до сих пор:
Я преобразую холст в blob
, затем получаю blob URL
и отправляю этот URL на мой сервер nodejs с помощью веб-сокетов.
Я получаю URL-адрес большого двоичного объекта следующим образом:
canvas.toBlob(function(blob) {
url = window.URL.createObjectURL(blob);
});
URL-адреса BLOB-объектов создаются для каждого видеокадра (если быть точным, 20 кадров в секунду) и выглядят примерно так:
blob:null/e3e8888e-98da-41aa-a3c0-8fe3f44frt53
Затем я получаю URL-адрес большого двоичного объекта с сервера через веб-сокеты, чтобы я мог использовать его, чтобы НАПИСАТЬ его на другой холст, чтобы его могли увидеть другие пользователи.
Я искал, как рисовать на холст из блоб-URL, но не смог найти ничего похожего на то, что я пытаюсь сделать.
Итак, у меня есть следующие вопросы:
Это правильный способ делать то, что я пытаюсь достичь? любой
плюсы и минусы будут оценены.
Есть ли другой, более эффективный способ сделать это, или я прав
путь
Заранее спасибо.
EDIT:
Я должен был упомянуть, что я не могу использовать WebRTC в этом проекте, и я должен делать все это с тем, что у меня есть.
, чтобы облегчить задачу всем, где я сейчас нахожусь, таким образом я пытался отобразить URL-адреса больших двоичных объектов, которые я упомянул выше, на холсте с помощью веб-сокетов:
websocket.onopen = function(event) {
websocket.onmessage = function(evt) {
var val = evt.data;
console.log("new data "+val);
var canvas2 = document.querySelector('.canvMotion2');
var ctx2 = canvas2.getContext('2d');
var img = new Image();
img.onload = function(){
ctx2.drawImage(img, 0, 0)
}
img.src = val;
};
// Listen for socket closes
websocket.onclose = function(event) {
};
websocket.onerror = function(evt) {
};
};
Проблема в том, что когда я запускаю этот код в FireFox, холст всегда пуст / пуст, но я вижу URL-адреса больших двоичных объектов в консоли, что заставляет меня думать, что я делаю неправильно.
и в Google Chrome я получаю Not allowed to load local resource: blob:
ошибку.
ВТОРОЕ РЕДАКТИРОВАНИЕ:
Вот где я сейчас нахожусь.
Первый вариант
Я попытался отправить целые объекты через веб-сокеты, и мне это удалось. Однако по какой-то странной причине я не смог прочитать его на стороне клиента!
когда я просматривал консоль моего сервера nodejs, я мог видеть что-то подобное для каждого большого двоичного объекта, отправляемого на сервер:
<buffer fd67676 hdsjuhsd8 sjhjs....
Второй вариант:
Таким образом, вышеприведенная опция не удалась, и я подумал о другом, который превращает каждый кадр холста в base64 (jpeg) и отправляет его на сервер через веб-сокеты, а затем отображает / рисует изображение base64 на холсте на стороне клиента.
Я отправляю на сервер 24 кадра в секунду.
Это сработало. НО холст на стороне клиента, где эти изображения base64 отображаются снова, очень медленный и похож на рисование 1 кадра в секунду. и это проблема, которая у меня есть на данный момент.
Третий вариант:
Я также пытался использовать видео без холста. Итак, используя WebRTC, я получил video Stream
как одиночный Blob . но я не совсем уверен, как его использовать и отправить на сторону клиента, чтобы люди могли его увидеть.
ВАЖНО: эта система, над которой я работаю, не является одноранговым соединением. Это всего лишь один из способов потокового вещания, которого я пытаюсь достичь.