Ich benutze requestAnimationFrame, um Video-Streams zu animieren, und ich weiß, dass Anfrage-Animation nicht in den Hintergründen funktioniert, also gibt es eine Möglichkeit, es im Hintergrund laufen zu lassen.Run requestAnimationFrame im Hintergrund
Ich weiß, dass wir mit setInterval oder setTimeout auch animieren können, aber wenn ich diese benutze, Animationen wurden nicht ordnungsgemäß funktionieren und Bilder im Video-Stream blinken.
Hier ist mein Code:
const drawFrame = function drawFrame() {
if (!ctx) {
ctx = canvas.getContext('2d');
}
if (!tmpCanvas) {
tmpCanvas = document.createElement('canvas');
tmpCtx = tmpCanvas.getContext('2d');
tmpCanvas.width = canvas.width;
tmpCanvas.height = canvas.height;
}
tmpCtx.drawImage(videoElement, 0, 0, tmpCanvas.width, tmpCanvas.height);
const imgData = tmpCtx.getImageData(0, 0, tmpCanvas.width, tmpCanvas.height);
const data = selectedFilter(imgData);
ctx.putImageData(data, 0, 0);
if (!stopped) {
requestAnimationFrame(drawFrame);
} else {
tmpCanvas = null;
tmpCtx = null;
ctx = null;
}
};
requestAnimationFrame(drawFrame);
Eigentlich verwende ich Tokbox js API, die nicht Änderungsstream in der Laufzeit unterstützen und wir müssen Effekte (statisches Bild) auf Video hinzufügen und dafür verwenden wir Kamera-Filter API, die requestAnimationFrame aber wie ich erwähne Es wird nicht im Hintergrund laufen, also gibt es einen Weg, um davon zu überwinden? –
requestAnimationFrame wurde speziell entwickelt, um einmal pro Animation mit einer RTS-Priorität auf Vordergrund-Registerkarten ausgeführt zu werden, jedoch nicht mit Hintergrund-Registerkarten. Wenn Sie dies im Hintergrund tun, treten Leistungsprobleme auf. Nicht alles in einem Browser kann priorisiert werden. Ich kenne keine andere Browser-übergreifende Möglichkeit, einen RequestAnimationFrame zu simulieren. –
Und setTimeout/setInterval ist nicht dafür gedacht. Wenn Sie ein Timeout für 30 ms setzen, besteht die einzige Garantie, dass es nicht ausgelöst wird, bis mindestens 30 ms vergangen sind. Wenn 30 ms verstrichen sind, wartet es darauf, dass der aktuell laufende Kontext beendet wird (da Javascript eine [meist] single-threaded Sprache ist). Darüber hinaus kann ein Browser versuchen, dies weiter zu drosseln, um Systemressourcen zu sparen. Oder, wenn eine Menge Javascript in mehreren Registerkarten läuft, kann das Betriebssystem den Browser selbst drosseln und ihm nur Zugriff auf eine bestimmte Anzahl von Kernen gewähren. –