【问题标题】:How to effect to video in fabric.js如何在fabric.js中影响视频
【发布时间】:2018-10-07 08:21:57
【问题描述】:

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

但它会停止视频。 如何对fabric.js中的视频产生影响?

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

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

↑我不使用 CSS 过滤器。 谁能解释一下?

谢谢。

<!DOCTYPE html>
<html>
<head>
<meta charset="SHIFT-JIS">
<title>sample</title>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.2.3/fabric.min.js"></script>
<script>


$(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);
    video1.getElement().load();


    $(document.body).on('click', '#play' ,function(){
        video1.getElement().play();

        //↓It's stops video.
        /*
        var filter = new fabric.Image.filters.BlendColor({
            color:'red',
            mode: 'tint',
            alpha: 0.5
        });
            canvas.item(0).filters.push(filter);
        canvas.item(0).applyFilters();
        */


    });




    fabric.util.requestAnimFrame(function render() {
      canvas.renderAll();
      fabric.util.requestAnimFrame(render);
    });

});
</script>

</head>
<body>
<button id="play">play</button>
<canvas id="c" width="300" height="300"></canvas>

<video id="video1" style="display: none" class="canvas-img" width="480" height="360">
  <source id="video_src1" src="https://html5demos.com/assets/dizzy.mp4" type="video/mp4">
</video>

</body>
</html> 

【问题讨论】:

  • 如果 webgl 不可用,它会非常慢,只要你知道。

标签: javascript jquery html html5-canvas fabricjs


【解决方案1】:

好的,这样就可以了,问题是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);
    });

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

【讨论】:

  • 是否可以下载/导出带有应用效果的视频?如果是,那么我该如何下载/导出它?
  • 浏览器中有一个 api,可让您从画布创建视频。
  • @AndreaBogazzi 什么样的 API?你能推荐一下吗?
  • 你要什么?我不明白。
  • @AndreaBogazzi 请检查我添加的这个问题,stackoverflow.com/questions/54266023/…
猜你喜欢
  • 2020-04-05
  • 2012-02-15
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多