Возможно копировать в режиме реального времени изображение элемента в браузереWindow, отображаемом на 60 кадров в секунду, в другие несколько браузеров в Atom Electron?Копия <canvas> изображение из браузераНовинка в другое на 60 кадров в секунду в Atom Electron
ответ
Вариант 1: Используйте window.open()
По состоянию на май 2017 года, теперь можно открыть новое окно в Electron с помощью window.open()
, аналогично тому, как это делает nwjs. Это означает, что нет необходимости беспокоиться о отправке изображения по различным процессам. Дополнительную информацию см. В разделе electron documentation. С ссылкой DOM на холст в новом окне вы можете легко скопировать изображение со старого холста в каждый кадр.
newCanvas.drawImage(oldCanvas, 0, 0, width, height)
Вариант 2: Использование WebRTC
Вы можете сделать поток от холста к видеоэлементу через WebRTC, локально между двумя окнами. Мое решение основано на ответе на related question, а также на полезном WebRTC canvas example. Откройте следующие две ссылки и нажмите «Подключиться».
Полотно для потоковой: https://jsfiddle.net/f5y48hcd/26/
var stream = canvas.captureStream();
...
stream.getTracks().forEach(
function(track) {
pc.addTrack(
track,
stream
);
}
);
видео элемент приема потока: https://jsfiddle.net/rfqhwo4z/10/
pc.ontrack = gotRemoteStream;
...
function gotRemoteStream(e) {
if (video.srcObject !== e.streams[0]) {
video.srcObject = e.streams[0];
}
}
Обратите внимание, что вам нужно вкладка холст активно работает на этом анимация на вкладке видео. Я еще должен проверить это в электронике.
Ничего себе! Я попробую на этой неделе с электроном и скажу вам результаты. Благодаря! – Ciberman
Я проверил его в электроне, и он отлично работает! Для заинтересованных пользователей я скопировал предоставленный код jsfiddle в два файла html и создал два окна из основного процесса ('streamer.html' с' show: false' и 'receiver.html' с' show: true'), и он отлично работает. Благодаря! – Ciberman
Фантастический. Мне бы хотелось услышать о том, что вы строите, я не знаю многих людей с такими же техническими требованиями для меня! Если вам интересно, вы можете связаться со мной через [email protected] – AlexKempton
Как насчет создания сокета Unix и конвейеру байт, что и читать его с другого процесса ?:
var net = require('net');
// This server listens on a Unix socket at /var/run/mysocket
var unixServer = net.createServer(function(client) {
// Do something with the client connection
});
unixServer.listen('/var/run/mysocket');
https://nodejs.org/api/net.html В противном случае вы можете просто открыть сокет на порт и обмениваться этим.
Основная причина, по которой вы не хотите, чтобы данные, поступающие из браузераWindow взад и вперед по основному процессу, заключались в том, что ваш BrowserWindow обрабатывает такие вещи, как положение окна и события ОС, поэтому вы не хотите замедлять их, через это.
Как вы получаете и устанавливаете байты из холста? Насколько я знаю, ctx.putImageData и ctx.getImageData слишком медленны, чтобы их можно было выполнить со скоростью 60 кадров в секунду. – Ciberman
@Ciberman, эти методы медленны, но вы можете сделать это на 60fps на большинстве современных машин (при условии, что ваш холст не 5000 * 5000px в ширину). Даже если это один из самых медленных методов в canvas2D API, он все равно достаточно быстро, если вы делаете это один раз за кадр. – Kaiido
Да. Но мое полотно 1080p. И мне приходится копировать на 3-4 внешних дисплея (холст). Я переношу свой проект с nwjs на Electron. В nwjs я могу сделать это без проблем. – Ciberman
Я не знаю электрона, но как связаны ваши разные окна? Доступны ли другие * BrowserWindow из окна Master? (например, это результат 'window.open'?) В этом случае, если вы можете получить доступ к контексту canvas других страниц, вы можете просто использовать' drawImage': http://plnkr.co/edit/jDzbtPYrYItQ4peplOAN ? p = preview – Kaiido
@Kaiido, нет, в Electron это не так просто. Каждое окно браузера - отдельный процесс. – Ciberman
Другим подходом будет webRTC (я не знаю, как его поддерживает электронная поддержка). Вы можете получить поток canvas непосредственно из ['canvas.captureStream (fps)'] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream), а затем просто визуализировать поток в скрытое видео, которое вы сможете нарисовать на разных полотнах. – Kaiido