2017-02-14 7 views
2

Возможно копировать в режиме реального времени изображение элемента в браузереWindow, отображаемом на 60 кадров в секунду, в другие несколько браузеров в Atom Electron?Копия <canvas> изображение из браузераНовинка в другое на 60 кадров в секунду в Atom Electron

3 visible browserWindow

+0

Я не знаю электрона, но как связаны ваши разные окна? Доступны ли другие * BrowserWindow из окна Master? (например, это результат 'window.open'?) В этом случае, если вы можете получить доступ к контексту canvas других страниц, вы можете просто использовать' drawImage': http://plnkr.co/edit/jDzbtPYrYItQ4peplOAN ? p = preview – Kaiido

+1

@Kaiido, нет, в Electron это не так просто. Каждое окно браузера - отдельный процесс. – Ciberman

+0

Другим подходом будет webRTC (я не знаю, как его поддерживает электронная поддержка). Вы можете получить поток canvas непосредственно из ['canvas.captureStream (fps)'] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream), а затем просто визуализировать поток в скрытое видео, которое вы сможете нарисовать на разных полотнах. – Kaiido

ответ

1

Вариант 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]; 
    } 
} 

Обратите внимание, что вам нужно вкладка холст активно работает на этом анимация на вкладке видео. Я еще должен проверить это в электронике.

+0

Ничего себе! Я попробую на этой неделе с электроном и скажу вам результаты. Благодаря! – Ciberman

+0

Я проверил его в электроне, и он отлично работает! Для заинтересованных пользователей я скопировал предоставленный код jsfiddle в два файла html и создал два окна из основного процесса ('streamer.html' с' show: false' и 'receiver.html' с' show: true'), и он отлично работает. Благодаря! – Ciberman

+0

Фантастический. Мне бы хотелось услышать о том, что вы строите, я не знаю многих людей с такими же техническими требованиями для меня! Если вам интересно, вы можете связаться со мной через [email protected] – AlexKempton

0

Как насчет создания сокета 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 обрабатывает такие вещи, как положение окна и события ОС, поэтому вы не хотите замедлять их, через это.

+0

Как вы получаете и устанавливаете байты из холста? Насколько я знаю, ctx.putImageData и ctx.getImageData слишком медленны, чтобы их можно было выполнить со скоростью 60 кадров в секунду. – Ciberman

+1

@Ciberman, эти методы медленны, но вы можете сделать это на 60fps на большинстве современных машин (при условии, что ваш холст не 5000 * 5000px в ширину). Даже если это один из самых медленных методов в canvas2D API, он все равно достаточно быстро, если вы делаете это один раз за кадр. – Kaiido

+0

Да. Но мое полотно 1080p. И мне приходится копировать на 3-4 внешних дисплея (холст). Я переношу свой проект с nwjs на Electron. В nwjs я могу сделать это без проблем. – Ciberman