参考:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Manipulating_video_using_canvas

   var captureImage = function () {var canvas = document.createElement("canvas");canvas.width = video.videoWidth * scale;canvas.height = video.videoHeight * scale;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);var img = document.createElement("img");// img.src = canvas.toDataURL('image/png');  // base64canvas.toBlob(function (blob) {//blob将base64编码的src 以二进制的形式存进了 Blob对象img.src = window.URL.createObjectURL(blob)// $('img').attr('src',HTMLMediaElement.srcObject(blob))//这个方法是MDN说会替代上面的方法 但是我在浏览器中使用还不支持(什么鬼???)// 图片ajax上传-》将blob二进制数据上传上去console.log(blob)}, 'image/png');$output.prepend(img);};

index.js

var processor = {};processor.doLoad = function doLoad() {this.video = document.getElementById("video");this.c1 = document.getElementById("c1");this.ctx1 = this.c1.getContext("2d");this.c2 = document.getElementById("c2");this.ctx2 = this.c2.getContext("2d");let self = this;this.video.addEventListener("play",function () {self.width = self.video.videoWidth / 2;self.height = self.video.videoHeight / 2;self.timerCallback();},false);
};
processor.timerCallback = function timerCallback() {if (this.video.paused || this.video.ended) {return;}this.computeFrame();let self = this;setTimeout(function () {self.timerCallback();}, 0);
};processor.computeFrame = function computeFrame() {this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);let frame = this.ctx1.getImageData(0, 0, this.width, 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];// rgba   255 255 0 黄色if (g > 100 && r > 100 && b < 43) {frame.data[i * 4 + 3] = 0;}}this.ctx2.putImageData(frame, 0, 0);return;
};

<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><style>body {background: black;color: #CCCCCC;}#c2,#c1 {background-image: url(foo.png);background-repeat: no-repeat;}div {float: left;border: 1px solid #444444;padding: 10px;margin: 10px;background: #3B3B3B;}</style></head><body><script id="__bs_script__">//<![CDATA[document.write("<script async src='/browser-sync/browser-sync-client.js?v=2.26.7'><\/script>".replace("HOST", location.hostname));
//]]></script><div><video id="video" src="video.ogv" controls="true" /></div><div><canvas id="c1" width="160" height="96"></canvas><canvas id="c2" width="160" height="96"></canvas></div><script src="./index.js"></script><script>processor.doLoad()</script>
</body></html>

视频素材下载 https://www.videvo.net/stock-video-footage/green-screen/
转载:https://blog.csdn.net/luofeng457/article/details/90186162

<!DOCTYPE html>
<html><head><style>body {background: black;color:#CCCCCC; }#c2 {background-image: url(a.png);background-repeat: no-repeat;}div {float: left;border :1px solid #444444;padding:10px;margin: 10px;background:#3B3B3B;}</style></head><body><div><video id="video" src="chicken.mp4" controls="true"/></div><div><canvas id="c1" width="480" height="270"></canvas><canvas id="c2" width="480" height="270"></canvas></div><script type="text/javascript">
let processor = {timerCallback: function() {if (this.video.paused || this.video.ended) {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");this.c2 = document.getElementById("c2");this.ctx2 = this.c2.getContext("2d");let self = this;this.video.addEventListener("play", function() {self.width = self.video.videoWidth / 4;self.height = self.video.videoHeight / 4;self.timerCallback();}, false);},computeFrame: function() {this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);let frame = this.ctx1.getImageData(0, 0, this.width, 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];if (g > 100 && r < 50)frame.data[i * 4 + 3] = 0;}this.ctx2.putImageData(frame, 0, 0);return;}};document.addEventListener("DOMContentLoaded", () => {processor.doLoad();
});</script></body>
</html>

视频录制处理一


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script id="__bs_script__">//<![CDATA[document.write("<script async src='/browser-sync/browser-sync-client.js?v=2.26.7'><\/script>".replace("HOST", location.hostname));
//]]></script>MediaRecorder.mimeType[只读]:返回实例化过程设置的媒体文件类型。笔者设备测试,如果未设置,默认返回:Chrome -> video/webm;codecs=vp8,Firefox -> video/webm;MediaRecorder.state[只读]:返回当前MediaRecorder实例的工作状态,可选值有:inactive、recording和paused;MediaRecorder.stream[只读]:返回当前媒体流,亦即实例化过程传入的媒体流对象MediaRecorder.ignoreMutedMedia:是否静音模式录制;MediaRecorder.start(timeslice):开始录制。timeslice参数可选,表示以该持续时间切片媒体数据;MediaRecorder.pause():暂停录制;MediaRecorder.resume():继续录制;MediaRecorder.stop():停止录制。<canvas width="600" height="600"></canvas><canvas id="video" width="600" height="600"></canvas><div id="videoContainer" style="display:none"><video controls="true" autoplay="true"></video></div><script>const canvas = document.querySelector('canvas');const ctx = canvas.getContext('2d');const { width, height } = canvas;ctx.fillStyle = 'red';function draw(rotation = 0) {ctx.clearRect(0, 0, 1000, 1000);ctx.save();ctx.translate(width / 2, height / 2);ctx.rotate(rotation);ctx.translate(-width / 2, -height / 2);ctx.beginPath();ctx.rect(200, 200, 200, 200);ctx.fill();ctx.restore();let videoCanvas = document.querySelector('#video')const content = videoCanvas.getContext('2d');content.clearRect(0, 0, videoCanvas.width, videoCanvas.height);// content.drawImage(canvas, 0, 0)  //整个画布let frame = ctx.getImageData(0, 0, canvas.width, canvas.height);const data = frame.data;for (var i = 0; i < data.length; i += 4) {data[i] = 255 - data[i];     // reddata[i + 1] = 255 - data[i + 1]; // greendata[i + 2] = 255 - data[i + 2]; // blue}content.putImageData(frame, 0, 0);}function update(t) {draw(t / 500);requestAnimationFrame(update);}const stream = canvas.captureStream();const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });const data = [];recorder.ondataavailable = function (event) {if (event.data && event.data.size) {data.push(event.data);}};recorder.onstop = () => {const url = URL.createObjectURL(new Blob(data, { type: 'video/webm' }));document.querySelector("#videoContainer").style.display = "block";document.querySelector("video").src = url;};recorder.start();update(0);setTimeout(() => {recorder.stop();}, 6000);</script>
</body></html>

视频录制处理二


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#c2,#c1 {background-image: url('./2.png');background-repeat: no-repeat;background-size: cover;}</style>
</head><body><script id="__bs_script__">//<![CDATA[document.write("<script async src='/browser-sync/browser-sync-client.js?v=2.26.7'><\/script>".replace("HOST", location.hostname));
//]]></script>MediaRecorder.mimeType[只读]:返回实例化过程设置的媒体文件类型。笔者设备测试,如果未设置,默认返回:Chrome -> video/webm;codecs=vp8,Firefox -> video/webm;MediaRecorder.state[只读]:返回当前MediaRecorder实例的工作状态,可选值有:inactive、recording和paused;MediaRecorder.stream[只读]:返回当前媒体流,亦即实例化过程传入的媒体流对象MediaRecorder.ignoreMutedMedia:是否静音模式录制;MediaRecorder.start(timeslice):开始录制。timeslice参数可选,表示以该持续时间切片媒体数据;MediaRecorder.pause():暂停录制;MediaRecorder.resume():继续录制;MediaRecorder.stop():停止录制。<canvas width="600" height="600"></canvas><canvas id="" width="600" height="600"></canvas><div id="videoContainer" style="display:none"><video id="video" controls="true" autoplay="true"></video></div><canvas id="c1" width="160" height="96"></canvas><canvas id="c2" width="160" height="96"></canvas><div style="height:100px "></div><script>var processor = {};processor.doLoad = function doLoad() {this.video = document.getElementById("video");this.c1 = document.getElementById("c1");this.ctx1 = this.c1.getContext("2d");this.c2 = document.getElementById("c2");this.ctx2 = this.c2.getContext("2d");let self = this;this.video.addEventListener("play",function () {self.width = self.video.videoWidth / 4;self.height = self.video.videoHeight / 4;self.timerCallback();},false);};processor.timerCallback = function timerCallback() {if (this.video.paused || this.video.ended) {return;}this.computeFrame();let self = this;setTimeout(function () {self.timerCallback();}, 0);};processor.computeFrame = function computeFrame() {this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);let frame = this.ctx1.getImageData(0, 0, this.width, 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];//     // rgba   255 255 0 黄色//     if (g > 100 && r > 100 && b < 43) {//         frame.data[i * 4 + 3] = 0;//     }// }const data = frame.data;for (var i = 0; i < data.length; i += 4) {data[i] = 255 - data[i];     // reddata[i + 1] = 255 - data[i + 1]; // greendata[i + 2] = 255 - data[i + 2]; // blue}this.ctx2.putImageData(frame, 0, 0);return;};</script><script>const canvas = document.querySelector('canvas');const ctx = canvas.getContext('2d');const { width, height } = canvas;ctx.fillStyle = 'red';function draw(rotation = 0) {ctx.clearRect(0, 0, 1000, 1000);ctx.save();ctx.translate(width / 2, height / 2);ctx.rotate(rotation);ctx.translate(-width / 2, -height / 2);ctx.beginPath();ctx.rect(200, 200, 200, 200);ctx.fill();ctx.restore();}function update(t) {draw(t / 500);requestAnimationFrame(update);}const stream = canvas.captureStream();const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });const data = [];recorder.ondataavailable = function (event) {if (event.data && event.data.size) {data.push(event.data);}};recorder.onstop = () => {const url = URL.createObjectURL(new Blob(data, { type: 'video/webm' }));document.querySelector("#videoContainer").style.display = "block";document.querySelector("video").src = url;processor.doLoad()};recorder.start();update(0);setTimeout(() => {recorder.stop();}, 6000);</script>
</body></html>

canvas 处理视频 录制-新相关推荐

  1. android录制视频横向,Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)...

    相机拍照.视频录制相机拍照 全屏显示有两种方式: 在androidManifest.xml里面的application标签下设置 android:theme="@android:style/ ...

  2. mpvue小程序实现人脸识别/视频录制/身份验证/CryptoJS加密 等功能

    mpvue小程序实现人脸识别/视频录制/身份验证/CryptoJS加密 等功能 先看效果图 mpvue小程序与数据宝对接实现人脸识别/视频录制/身份验证/CryptoJS 加密 等功能关键代码 ind ...

  3. 模仿微视视频录制、支持按下录制抬起暂停以及断点进度条(基于javacv)

    apk下载视频录制apk下载, 项目源码地址为https://github.com/qdrzwd/VideoRecorder 补充:感谢雷军辉提供的文档 wiki: http://www.elesos ...

  4. Android 基于MediaCodec开发抖音短视频录制(贰)

    前言 上一篇文章中,我大概介绍了一下短视频的拍摄,主要就是音视频的加减速.这篇文章我将介绍下抖音视频特效的实现,废话不多说,进入正题. 1.特效概览 抖音上目前有这九种视频特效,本文将介绍前面六种的实 ...

  5. 视频录制,压缩实现源码

    实现代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title& ...

  6. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  7. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  8. obs捕获窗口没有窗口_学习工具 | 视频录制软件OBS

    小编今天为你们带来了一位新朋友,它就是: OBS 了解OBS OBS是免费和开源软件的视频录制和实时流.在 Windows.Mac 或 Linux 上都能够快速轻松地下载并开始流式传输. 小知识: 流 ...

  9. android 录音原始文件_Android 11可能最终会取消Android对视频录制的4GB文件大小限制...

    2019年,智能手机品牌在相机质量上有了巨大的飞跃,尤其是在变焦和微光方面.另一方面,视频质量并没有得到同等的重视.2020年,随着高通骁龙(Qualcomm Snapdragon) 865网络服务提 ...

最新文章

  1. 黑盒测试之边界值测试
  2. MATLAB中深度学习的数据集合
  3. 搭建prometheus+grafana监控系统
  4. java 报500该怎么解决_关于servlet500错误 应该怎么解决
  5. java线程唤醒线程_Java中如何唤醒“指定的“某个线程
  6. spring 测试 事务_Spring陷阱:事务测试被认为是有害的
  7. 支付宝支付-手机浏览器H5支付
  8. 荣耀v40pro可以用鸿蒙系统,荣耀V40Pro快来了!麒麟9000+120Hz+鸿蒙系统,价格感人...
  9. oracle 内部表连接方式,ORACLE 表连接方式
  10. grub的概念,简单描述一下
  11. 数据结构 3-0 栈与队列总结
  12. 怎么打钩_如何在excel中打钩
  13. (二十六)Storm常见错误及处理方法
  14. HTML字体大小的设置
  15. Removing-Camera-Shake-from-a-Single-Photograph图像去模糊读书笔记
  16. C#——signalr实现简单的网页实时聊天
  17. 如何理解 ssh 三大框架
  18. 【PE258】A lagged Fibonacci sequence
  19. 华为机试真题 Python 实现【模拟商场优惠打折】【2022.11 Q4 新题】
  20. 转载: 外企九年-我最终选择放弃

热门文章

  1. (第2课)【初识python爬虫】
  2. 干货 | CoAP协议例析
  3. python中文分句_中文文本分句
  4. 通过宏函数计算结构体成员偏移量
  5. 公牛和母牛(猜数字游戏)
  6. ios计算机隐藏功能,10个iOS12使用技巧和隐藏功能,让你快人一步成为玩机达人...
  7. 小提琴统计图_箱形图和小提琴图
  8. Linux(程序设计):29---Zlib库(数据压缩与解压)
  9. MobileNet在手机端上的速度评测:iPhone 8 Plus竟不如iPhone 7 Plus
  10. golang 定时任务处理