h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度
视频透明度抠图,视频需要一个灰度通道副本表示透明度
目前抖音等直播平台的礼物特效就是这个方法处理的
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>视频灰度通道抠图,视频包含灰度值表示透明的副本</title>
<style>
html, body {
::-webkit-scrollbar {
display: none;
};
background:rgba(0,0,0, 0); } div {
padding:0px;
margin: 0px;
} #c1 {
opacity: 0.001;
position:absolute;
left:0;
top:0;
z-index:0;
}
#c2 {
opacity: 1;
position:absolute;
left:0;
top:0;
z-index:3; } </style>
</head> <body style="background:url(bg.jpg)"> <div style="position:absolute;top:80px;left:0px;z-index:0;opacity:0.001">
<video width="555" height="777"
id="video"
src="media/789.dll"
controls="true"
crossorigin="anonymous" autoplay muted/>
</div> <canvas id="c1" width="1440" height="1280"></canvas>
<canvas id="c2" width="720" height="1280"></canvas> <input type='button' value="---change role---" style=" height:58px;position:absolute;top:122px;left:0px;z-index:99;"
onclick='setRole(805)'></input> <script> const tolerance = 5;
var roleId=1; function setRole(id){
var video = document.getElementById("video");
video.src='media/'+id+'.dll?'+new Date().getTime();
processor.c2.style.opacity=1;
// video.play();
//idle(); } function hideLayer()
{ processor.c2.style.opacity=0; } let processor = {
timerCallback: function() {
if (this.video.paused || this.video.ended) {
console.log("video.ended");
this.c2.style.opacity=0;
return;
}
this.computeFrame();
let self = this;
setTimeout(function () {
self.timerCallback();
}, 0);
}, doLoad: function() {
this.video = document.getElementById("video");
this.c1 = document.getElementById("c1");
this.ctx1 = this.c1.getContext("2d", { willReadFrequently: true });
this.c2 = document.getElementById("c2");
this.ctx2 = this.c2.getContext("2d", { willReadFrequently: true });
let self = this;
this.video.addEventListener("play", function() {
self.width = self.video.videoWidth ;
self.height = self.video.videoHeight;
self.c2.style.width= self.width / 2;
self.c1.style.width= self.width;
console.log("w=" + self.video.videoWidth); self.timerCallback();
}, false);
}, computeFrame: function() {
if(this.width<=0){
console.log("width:"+this.width);
return;
}
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
let frameOpcity= this.ctx1.getImageData(this.width / 2, 0, this.width / 2, this.height);
let frame = this.ctx1.getImageData(0, 0, this.width / 2, this.height); let l = frame.data.length / 4; for (let i = 0; i < l; i++) {
let r = frame.data[i * 4 + 0];
let g = frame.data[i * 4 + 1];
let b = frame.data[i * 4 + 2];
let a= (r+ g+ b) / 3;
frameOpcity.data[i * 4 + 3] = a; } this.ctx2.putImageData(frameOpcity, 0, 0);
return; }
} document.addEventListener("DOMContentLoaded", () => {
processor.doLoad();
}); </script> </body>
</html>
h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度的更多相关文章
- H5 的直播协议和视频监控方案
H5 的直播协议和视频监控方案 一.流媒体主要实现方式 二.流媒体技术 2.1 流媒体 2.2 直播 2.3 流协议 2.3.1 HLS 协议 2.3.2 RTMP 协议 2.3.3 RTSP 协议 ...
- canvas与html5实现视频截图功能
这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...
- paper 116:自然图像抠图/视频抠像技术梳理(image matting, video matting)
1. Bayesian Matting, Chuang, CVPR 2001.http://grail.cs.washington.edu/projects/digital-matting/paper ...
- EasyNVR网页H5无插件播放摄像机视频功能二次开发之直播通道接口保活示例代码
背景需求 随着雪亮工程.明厨亮灶.手机看店.智慧幼儿园监控等行业开始将传统的安防摄像头进行互联网.微信直播,我们知道摄像头直播的春天了.将安防摄像头或NVR上的视频流转成互联网直播常用的RTMP.HT ...
- PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...
- 用H5 Canvas绘制一个仪表盘笔记
前端有许多做数据可视化的图表插件,但有时候UI设计的图可能用现成的js插件无法定制或者比较麻烦(还不如自己造轮子来的快). 下面记录下用H5 canvas设计一个仪表盘代码: <!DOCTYPE ...
- moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...
- moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip类详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了剪辑相关类及关系,其中VideoClip有多个直接子类和间接子类 ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- C#控制台程序取得INSOYA视频区的视频的真实URL,视频标题,发布时间集合。
准备工作 起因是因为这个网站:http://i.youku.com/kmsfan 这个是一个叫做冒险岛的游戏的资讯论坛,以前我经常在里面传视频,现在我不玩这个游戏了,但是很多玩家还是经常到我的网站里面 ...
随机推荐
- 面试:靠着这篇笔记,我拿下了16k车载测试offer!
如何写简历个人技能个人技能一般不要超过10条,一般在8条内. 一.测试流程和技术 1.熟悉车载系统研发和测试流程,能独立编写各种测试文档. 2.熟悉车载系统测试用例设计思路,能独立编写仪表和车机的测试 ...
- 4G模组软件指南 | json数据处理深度学习篇
针对4G模组软件的json数据处理,我已做出如下示例分享给大家,以4G模组Air780E为例: 1.JSON介绍 JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式 ...
- mobile频段要查找、设置并获取相关参数,该怎么破?
今天我们一起来学习查找和设置mobile频段,并获取相关参数. 一.mobile概述 1.1 简介 "4G mobile"指的是第四代移动通信技术,常用于描述通过4G网络进行的 ...
- thinkpad x250装manjaro linux,解决指纹和远程桌面问题
前言 家里有个thinkpad x250闲置,平时主要用windows,大概隔一年半年装一次linux看看发展程度. 自己平时用的服务器一般装centos和debian,偶尔是ubuntu. 桌面li ...
- RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源.GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配 Text Embedding 榜单:MTEB.C-MTEB <MTEB: Mas ...
- CommonsCollections3(基于ysoserial)
环境准备 JDK1.7(7u80).commons-collections(3.x 4.x均可这里使用3.2版本).javassist(3.12.1.GA) JDK:https://repo.huaw ...
- python 3.7环境安装并使用csv
因为调换需要,进了另外一个维护组,需要用python解析excel csv,所以就下载了一下他们需要的python3.7 如何做呢,看步骤 1.去官网 2.找版本 3.下源码 4.解压出来进入文件夹 ...
- Redis未授权漏洞复现
目录 Redis 漏洞的产生条件及利用 Redis环境搭建 漏洞复现 利用Redis写入Webshell 利用Redis写入SSH公钥 利用Redis写入计划任务 Redis安全防护 Redis re ...
- STATA数据统计软件学习记录
STATA是一个数据统计软件,正如它的名字一样,STATA=statistic+data.STATA软件的功能和matlab类似,也可以用代码实现数据的统计与可视化.但几乎只能进行整行整列的数据处理, ...
- vue中方法中数据已更新,但是视图却没有变化解决方法
今天在项目中碰到这样一个问题: 从父组件中传过来的props中的数据,在子组件中想加入一个变量.在created中加入变量,在方法中打印次变量是有的,但是当变量发生变化之后,视图中是响应不到的. 解决 ...