Я использую navigator.webkitGetUserMedia
захватить скриншот окна один раз каждую секунду, назначив возвращаемый stream
к <video>
и скопировать его в <canvas>
и сохранение буфера в файл.Сокращение использования ЦП navigator.webkitGetUserMedia (Electron: DesktopCapturer)
Использование процессора в моем приложении постоянно высокое, и я точно указал его на эту область.
Код
// Initialize the video, canvas, and ctx
var localStream,
_video = document.querySelector('#video'),
_canvas = document.querySelector('#canvas'),
_ctx = _canvas.getContext('2d'),
sourceName = 'my-window-id';
// Load the stream from navigator.webkitGetUserMedia
navigator.webkitGetUserMedia({
audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: sourceName,
minWidth: 1920,
maxWidth: 1920,
minHeight: 1080,
maxHeight: 1080
}
}
}, gotStream, getUserMediaError);
function gotStream(stream) {
// Use the stream in our <video>
_video.src = window.URL.createObjectURL(stream);
// Reference the stream locally
localStream = stream;
}
function captureState() {
var buffer,
dataURL;
// Draw <video> to <canvas> and convert to buffer (image data)
_ctx.drawImage(_video, 0, 0);
dataURL = _canvas.toDataURL('image/png');
buffer = new Buffer(dataURL.split(",")[1], 'base64');
// Create an image from the data
fs.writeFileSync('screenshot.png', buffer);
}
// Capture state every second
setInterval(function() {
captureState();
}, 1000);
Этот код не мой бежать, это упрощенная версия того, что у меня есть в моем коде, чтобы сделать его StackOverflow читаемым.
Вещи я Пробовал
_video.pause()
и_video.play()
при необходимости. Кажется, не изменилось использование ЦП._video.stop()
. Это означает, что мне придется снова получить поток, который вызывает всплеск использования ЦП хуже, чем держать его открытым.
Мой лучший ведущий прямо сейчас, чтобы изменить частоту кадров, добавив:
optional: [
{ minFrameRate: 1 },
{ frameRate: 1 }
]
Крайне низкая частота кадров будет в порядке. Однако я не смог определить, работает ли в этом случае настройка frameRate
. The docs не указаны в списке и у меня нет новых mediaDevices.getUserMedia
.
Возможно ли установить очень низкие частоты кадров (или вообще любые) для navigator.webkitGetUserMedia
?
Кто-нибудь мог уменьшить использование ЦП в потоке любым другим способом?
Любые альтернативные способы достижения одной и той же цели (захват состояния по интервалу) также будут полезны.
Спасибо!
Side Примечание
Это в приложение Electron на Windows, используя DesktopCapturer, чтобы получить chromeMediaSourceId
.
Обновление на Использование CPU
- Стоимость работы
stream
: 6% загрузки процессора - Вызов
captureState
каждые 1000 мс: 5% Использование CPU
Всего ток: 11 %
Cu редко работая над сокращением № 2 на основе рекомендаций Csaba Toth до сих пор. Я должен был бы уменьшить captureState
, изменив, как захвачен холст. Будет обновляться, когда это будет сделано.
Для # 1, если я не могу избежать захвата видеопотока, мне нужно просто попытаться ограничить общее использование ЦП чуть более 6%, оптимизируя # 2.
Какой у вас процессор? 6% + 5% не обязательно слишком плохо ИМХО. Если это 6-8 ядер, это все равно поглотит одно ядро. Не ожидайте полного устранения №2. Может быть, это хорошая идея, чтобы увидеть, можно ли скриншот без видеопотока. –
i5-6500. Нет, это не страшно, похоже, сейчас все в порядке. Я использовал несколько потоков по другой причине, но нашел обходной путь и теперь нужен только один поток. Если я смогу заставить его остаться ниже 10%, я буду счастлив, я думаю, что ваши суффиксы ниже должны получить меня там. – Matt