MAH*_*OTO 1 html javascript jquery html5-canvas fabricjs
我想对视频使用图像过滤器。\n( http://fabricjs.com/image-filters )
\n\n但它停止了视频。\n如何在 Fabric.js 中对视频进行影响?
\n\n例如,如何更改视频的颜色?
\n\nhttps://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> \nRun Code Online (Sandbox Code Playgroud)\n
好的,这样就可以完成,问题是 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)