J'utilise navigator.webkitGetUserMedia
pour capturer capture d'écran d'une fenêtre une fois par seconde en attribuant le retour stream
à un <video>
et la copie à un <canvas>
et sauver le tampon de fichier.Réduction de l'utilisation du processeur de navigator.webkitGetUserMedia (Electron: DesktopCapturer)
L'utilisation du processeur dans mon application est toujours élevée et je l'ai identifié dans cette zone.
code
// 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);
Ce code mon ne fonctionne pas, il est une version simplifiée de ce que j'ai dans mon code pour le rendre lisible StackOverflow.
choses que j'ai essayé
_video.pause()
et_video.play()
en cas de besoin. Ne semble pas changer l'utilisation du processeur._video.stop()
. Cela signifie que je devrais récupérer le flux, ce qui provoque une augmentation de l'utilisation du processeur pire que de le garder ouvert.
Mon meilleur plomb est de changer en ce moment le taux de trame en ajoutant:
optional: [
{ minFrameRate: 1 },
{ frameRate: 1 }
]
extrêmement faible taux d'image serait bien. Cependant, je n'ai pas pu déterminer si le réglage frameRate
fonctionne dans ce cas. The docs ne l'ai pas énuméré et je n'ai pas le plus récent mediaDevices.getUserMedia
disponible.
Est-il possible de définir des fréquences d'images extrêmement basses (ou pas du tout) pour navigator.webkitGetUserMedia
?
Est-ce que quelqu'un a été capable de réduire l'utilisation du processeur du flux d'une autre manière?
Toute autre méthode permettant d'atteindre le même objectif (capture d'état sur intervalle) serait également utile.
Merci!
Side Note
Ceci est une application électronique sur Windows en utilisant DesktopCapturer pour obtenir le chromeMediaSourceId
.
Mise à jour sur l'utilisation du processeur
- coût de fonctionnement
stream
: 6% CPU Utilisation - Appel
captureState
tous les 1000ms: 5% CPU Utilisation
total actuel: 11 %
Cu travaille actuellement à réduire la # 2 sur la base des recommandations de Csaba Toth jusqu'à présent. Je devrais pouvoir réduire captureState
en changeant comment la toile est capturée. Mettra à jour quand c'est fait.Pour le n ° 1, si je ne peux pas éviter de capturer le flux vidéo, je vais juste essayer de limiter l'utilisation totale du processeur à un peu plus de 6% en optimisant le # 2.
Quel type de CPU avez-vous? 6% + 5% n'est pas nécessairement trop mauvais à mon humble avis. Si c'est 6-8 cœurs, cela consomme un noyau complètement cependant. Ne vous attendez pas à éliminer complètement # 2. Peut-être que c'est une bonne idée de voir s'il est possible de faire une capture d'écran sans flux vidéo. –
i5-6500. Non ce n'est pas terrible, ça semble fonctionner correctement maintenant. J'utilisais plusieurs flux avant pour une autre raison mais j'ai trouvé une solution de contournement et maintenant je n'ai besoin que d'un flux. Si je peux l'obtenir pour rester en dessous de 10%, je serai heureux, je pense que vos sugestions ci-dessous devraient m'y amener. – Matt