Необходимо трансилировать видео с экрана компьютера на веб-страницу в реальном времени. Также из веб-страницы передаются нажатия клавиш, клики и т.д. получается такой колхозный RDP(Эта часть реализована и не вызывает вопросов).
Как это сейчас реализовано
1. Консольное программа на С# выполняется на компьютере экран которого необходимо трансиловать.
2. Программа делает скриншот в формате jpeg
3. Программа пересылает скриншот в бинарном виде по WebSocket в браузер.
4. Далее js рендерит это изображение в canvas.
var _canvas = document.getElementById("player");
var _ctx = _canvas.getContext("2d");
var _image = new Image();
_image.onload = function() {
_ctx.drawImage(_image, 0, 0);
};
socket.onmessage = function(event) {
URL.revokeObjectURL(_image.src);
_image.src = URL.createObjectURL(event.data);
};
Это работает и достаточно быстро но не real-time небольшая задержка есть 100-150мс.
Собрав статистику производительности в браузере получил следущее.
Из таймлайна видно что в "Other" все занято вызовами URL.createObjectURL. По другому отобразить байтовый массив с картинкой в js невозможно. Собственно здесь тупик.
Соотвественно вопросы:
1. Каким образом в С# можно захватить видео поток с экрана компьтютера и передать его в браузер.
2. Можно ли как то ускорить существующую схему передачи изображения? если да то как?