如何在fabric.js中对视频进行效果

MAH*_*OTO 1 html javascript jquery html5-canvas fabricjs

我想对视频使用图像过滤器。\n( http://fabricjs.com/image-filters )

\n\n

但它停止了视频。\n如何在 Fabric.js 中对视频进行影响?

\n\n

例如,如何更改视频的颜色?

\n\n

https://codepen.io/html5andblog/pen/dmKJH

\n\n

\xe2\x86\x91我不使用 CSS 过滤器。\n有人可以解释一下吗?

\n\n

谢谢。

\n\n
<!DOCTYPE html>\n<html>\n<head>\n<meta charset="SHIFT-JIS">\n<title>sample</title>\n<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>\n<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.2.3/fabric.min.js"></script>\n<script>\n\n\n$(document).ready(function() {\n\n    canvas = new fabric.Canvas(\'c\');\n    canvas.setWidth(480);\n    canvas.setHeight(360);\n\n    var video1El = document.getElementById(\'video1\');\n    var video1 = new fabric.Image(video1El, {\n      left: 0,\n      top: 0\n    });\n\n    canvas.add(video1);\n    video1.getElement().load();\n\n\n    $(document.body).on(\'click\', \'#play\' ,function(){\n        video1.getElement().play();\n\n        //\xe2\x86\x93It\'s stops video.\n        /*\n        var filter = new fabric.Image.filters.BlendColor({\n            color:\'red\',\n            mode: \'tint\',\n            alpha: 0.5\n        });\n            canvas.item(0).filters.push(filter);\n        canvas.item(0).applyFilters();\n        */\n\n\n    });\n\n\n\n\n    fabric.util.requestAnimFrame(function render() {\n      canvas.renderAll();\n      fabric.util.requestAnimFrame(render);\n    });\n\n});\n</script>\n\n</head>\n<body>\n<button id="play">play</button>\n<canvas id="c" width="300" height="300"></canvas>\n\n<video id="video1" style="display: none" class="canvas-img" width="480" height="360">\n  <source id="video_src1" src="https://html5demos.com/assets/dizzy.mp4" type="video/mp4">\n</video>\n\n</body>\n</html> \n
Run Code Online (Sandbox Code Playgroud)\n

And*_*zzi 6

好的,这样就可以完成,问题是 FabricJS 可以更快地缓存纹理,并避免每次 applyfilters 将它们拉到显卡中以节省时间。

在这种情况下,我必须修改你的代码 n 2 个地方:

1)applyFilters需要在每个动画帧运行

2)每次必须删除纹理的缓存

最困难的部分是找到启用了 cors 的视频。

$(document).ready(function() {

    canvas = new fabric.Canvas('c');
    canvas.setWidth(480);
    canvas.setHeight(360);

    var video1El = document.getElementById('video1');
    var video1 = new fabric.Image(video1El, {
      left: 0,
      top: 0
    });

    canvas.add(video1);
    video1El.load();


    $(document.body).on('click', '#play' ,function(){
        video1El.play();
        var filter = new fabric.Image.filters.BlendColor({
            color:'red',
            mode: 'tint',
            alpha: 0.5
        });
        video1.filters = [filter];
    });




    fabric.util.requestAnimFrame(function render() {
      var image = canvas.item(0);
      var backend = fabric.filterBackend;
      if (backend && backend.evictCachesForKey) {
        backend.evictCachesForKey(image.cacheKey);
        backend.evictCachesForKey(image.cacheKey + '_filtered');
      }
      canvas.item(0).applyFilters();
      canvas.renderAll();
      fabric.util.requestAnimFrame(render);
    });

});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.2.3/fabric.min.js"></script>
<button id="play">play</button>
<canvas id="c" width="300" height="300"></canvas>
<video crossorigin="anonymous" id="video1" style="display: none" class="canvas-img" width="480" height="360">
  <source id="video_src1" src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" type="video/mp4">
</video>
Run Code Online (Sandbox Code Playgroud)