2017-10-16 5 views
1

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); 

Antwort

1

Ich denke, man kein Glück. requestAnimationFrame wird absichtlich im Hintergrund angehalten, da Animationen keinen Grund haben, im Hintergrund ausgeführt zu werden. Wie Sie erwähnen, sind setInterval und setTimeout nicht für Animationen vorgesehen und sollten nicht als solche verwendet werden.

Sie erwähnen, dass Sie einen Video-Stream animieren müssen. Meinst du, dass du eine Animation über einem Video-Tag anlegst oder das Aussehen des Video-Elements über ein Canvas-Element änderst? In beiden Fällen sollten Sie dies nicht immer im Hintergrund tun, aber Sie können computeFrame (nur Firefox) geben, der einmal in jedem Frame des Videos ausgelöst wird. Oder täuschen Sie gerade einen Videostream vor, indem Sie nacheinander eine Reihe von statischen Bildern animieren? Warum verwenden Sie das Videoelement in diesem Fall nicht?

+0

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? –

+0

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. –

+0

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. –