在后台运行requestAnimationFrame

时间:2017-10-16 08:26:18

标签: javascript jquery api video-streaming tokbox

我正在使用requestAnimationFrame动画视频流,我知道请求动画在背景中不起作用,所以有什么方法可以让它在后台运行。

我知道我们也可以使用setInterval或setTimeout制作动画,但是当我使用这些动画时,动画无法正常工作,视频流上的图像也会闪烁。

这是我的代码:

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

1 个答案:

答案 0 :(得分:1)

我猜你运气不好。 requestAnimationFrame故意在后台暂停,因为动画没有理由在后台运行,正如你所提到的那样setInterval和setTimeout不是为动画而设计的,不应该这样使用。

您提到需要为视频流制作动画。您是指在视频标签上应用动画,还是通过画布元素更改视频元素的外观?在这两种情况下,你都不应该在后台继续这样做,但是你可以给computeFrame(仅限Firefox)一个go,它将在视频的每一帧发射一次。或者你是通过连续制作一组静态图像来伪造视频流?在这种情况下,你为什么不使用视频元素?