录制和保存视频,通过三个按钮配合完成。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body ><div style="width: 80%; margin: 0 auto;">
<!--    <button id="begin">开始</button>--><button id="record" disabled>录制</button>
<!--    <button id="play" disabled>播放</button>--><button id="download" disabled>下载</button><button id="reStart" disabled>重新开始</button>
<!--    <button id="upload">上传</button>-->
</div>
<video id="gum", controls preload="none" width="30%" height="30%"  data-setup="{}" autoplay="autoplay"></video>
<p id="status", style="text-align: center;width: 402px;"></p>
<script>var mediaSource = new MediaSource();  //打开电脑摄像头// mediaSource.addEventListener('sourceopen', handleSourceOpen, false);var mediaRecorder ;var recordedBlobs;var sourceBuffer;var littleVideo = false;var gumVideo = document.querySelector("#gum");  //把图像显示在video上var statusV = document.getElementById("status"); //显示状态信息// var recordedVideo = document.querySelector("video#recorded");// statusV.innerText = '准备阶段';// var beginButton = document.querySelector("button#begin");var recordButton = document.querySelector("button#record");var playButton = document.querySelector("button#play");var downloadButton = document.querySelector("button#download");var reStartButton = document.querySelector("button#reStart");var uploadBtn = document.querySelector("button#upload");recordButton.onclick = toggleRecording;// playButton.onclick = play;downloadButton.onclick = download;reStartButton.onclick = restartRecord;var constraints = {audio: true,video: true};function handleSuccess(stream) {recordButton.disabled = false;console.log("getUserMedia() got stream: ", stream);window.stream = stream;if (window.URL) {//gumVideo.src = window.URL.createObjectURL(stream);gumVideo.srcObject = stream;} else {gumVideo.src = stream;}gumVideo.addEventListener('pause',function() {if(i){window.clearInterval(i);}},false);gumVideo.addEventListener('ended',function() {if(i){clearInterval(i);}},false);}// function handleError(error) {//     console.log("navigator.getUserMedia error: ", error);// }navigator.mediaDevices.getUserMedia(constraints).  //打开摄像头then(handleSuccess).catch(handleError);// function handleSourceOpen(event) {//     console.log("MediaSource opened");//     sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');//     console.log("Source buffer: ", sourceBuffer);// }// recordedVideo.addEventListener('error', function(ev) {//     console.error('MediaRecording.recordedMedia.error()');//     alert('Your browser can not play\n\n' + recordedVideo.src//         + '\n\n media clip. event: ' + JSON.stringify(ev));// }, true);function handleDataAvailable(event) {if (event.data && event.data.size > 0) {recordedBlobs.push(event.data);}}function handleStop(event) {console.log("Recorder stopped: ", event);}function toggleRecording() {if (recordButton.textContent === '录制' || recordButton.textContent === '重录') {littleVideo = false;startRecording();} else {stopRecording();recordButton.textContent = '重录';// playButton.disabled = false;downloadButton.disabled = false;reStartButton.disabled = false;}}function startRecording() {statusV.innerText = '开始录制';//todo:显示录制中 提示recordedBlobs = [];var options = {mimeType: 'video/webm;codecs=vp9'};if (!MediaRecorder.isTypeSupported(options.mimeType)) {console.log(options.mimeType + ' is not Supported');options = {mimeType: 'video/webm;codecs=vp8'};if (!MediaRecorder.isTypeSupported(options.mimeType)) {console.log(options.mimeType + ' is not Supported');options = {mimeType: 'video/webm'};if (!MediaRecorder.isTypeSupported(options.mimeType)) {console.log(options.mimeType + ' is not Supported');options = {mimeType: ''};}}}try {mediaRecorder = new MediaRecorder(window.stream, options);} catch (e) {console.error('Exception while creating MediaRecorder: ' + e);alert('Exception while creating MediaRecorder: '+ e + '. mimeType: ' + options.mimeType);return;}// console.log('Created MediaRecorder', mediaRecorder, 'with options', options);recordButton.textContent = '停止';// playButton.disabled = true;downloadButton.disabled = true;reStartButton.disabled = true;mediaRecorder.onstop = handleStop;mediaRecorder.ondataavailable = handleDataAvailable;mediaRecorder.start(10); // collect 10ms of data// console.log('MediaRecorder started', mediaRecorder);}function stopRecording() {statusV.innerText = '停止录像';//影藏录制中提mediaRecorder.stop();console.log('Recorded Blobs: ', recordedBlobs);//recordedVideo.controls = true;}// function play() {//     var superBuffer = new Blob(recordedBlobs, {type: 'video/mp4'});//     //recordedVideo.src = window.URL.createObjectURL(superBuffer);//     gumVideo.src = window.URL.createObjectURL(superBuffer);// }function download() {var blob = new Blob(recordedBlobs, {type: 'video/mp4'});var url = window.URL.createObjectURL(blob);var a = document.createElement('a');a.style.display = 'none';a.href = url;//文件名 通过方法传进来 检测是否合法?a.download = '视频录像.mp4';document.body.appendChild(a);a.click();setTimeout(function() {document.body.removeChild(a);window.URL.revokeObjectURL(url);}, 100);}function upload(){formData.append('nickName','Jack');//-->后台用req.body.nickName将值'Jack'取出var blob = new Blob(recordedBlobs, {type: 'video/mp4'});// var data = new FormData();var data = new FormData();data.append('file', file);return uploadVideoFile(data).then(res => {return this.recordVideoUrl = res.url;//获取上传的视频地址})// data.append('video', blob);// data.append('qw', 123);// data.append('question', 1);// var formData = new FormData();//// formData.append("username", "Groucho");// formData.append("accountnum", 123456); // 数字 123456 会被立即转换成字符串 "123456"//// // JavaScript file-like 对象// var content = '<a id="a"><b id="b">hey!</b></a>';// var blob = new Blob([content], { type: "text/xml"});//// formData.append("webmasterfile", blob);//// console.log(formData);$.ajax({type: "POST",url: "/form/data",data: data,processData:false,   //  告诉jquery不要处理发送的数据contentType:false,    // 告诉jquery不要设置content-Type请求头success:function(msg){console.log(msg);}});}function restartRecord(){//清楚存留 按钮功能重置recordButton.textContent = '录制';playButton.disabled = true;downloadButton.disabled = true;reStartButton.disabled = true;//handleSuccess();navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);// statusV.innerText = '准备阶段';}
</script>
</body>
</html>

打开电脑摄像头

html实现视频录制,保存和回放相关推荐

  1. 基于OpenCV的摄像头视频录制保存工具【附GIT源码地址】

    最近一个项目需要使用USB摄像头去采集视频并保存成文件,需要一个摄像头录制工具,要求其实很简单,就是能够将摄像头采集的图像加上一个时间戳的水印,实时保存到指定的文件中.同时为了防止文件过大,最好能够按 ...

  2. 基于kinect + EmguCV 的监控小应用(视频录制保存)

    kinectMonitor 源码位置 家庭监控小应用–https://gitee.com/ellecommander/kinecMonitor 介绍 基于kinect的家庭监控系统,主要是为了监控我爸 ...

  3. android 视频录制 保存到本地

    2021.1.19 更新: github下载地址. 有用的话麻烦点个星星 谢谢 下面贴一下 主要的代码 详细 请去下载我上传的dmeo /******************************* ...

  4. javacv实现rtsp视频流录制保存视频

    目录 1回顾 2代码实现 3结果验证 4总结 1回顾 前面几篇文章分别分享了vlc的安装以及播放rtsp流媒体:在HTML中嵌入vlc播放器实现对rtsp的播放:javacv根据帧抓取图片: 记下来本 ...

  5. Android (系统+自定义)短视频录制(含暂停继续录制功能) 总结

    前言 在Android开发中自然少不了对视频录制的需求,然而视频录制虽然有系统提供给我们能够直接使用的API,但是我们往往在完成需求的过程中需要自定义实现短视频录制.网上虽然也有不少资料,但是总是零零 ...

  6. Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

    本文主要介绍使用FluorineFx.Net来实现视频录制与视频回放,FluorineFx如同FMS一样,除了有AMF通信,RTMP协议,RPC和远程共享对象外,它同样具备视频流服务的功能.通过它我们 ...

  7. FluorineFx:视频录制及回放(Flash/AS3环境)

    如果不考虑安全因素(指任何人都可连接FluorineFx进行视频录制,而不需要登录认证),其实服务端不用写一行代码,仅需要在apps目录下建一个子目录当作应用,以及在services-config.x ...

  8. 怎么在计算机里找到CF里保存的视频,电脑怎么查看穿越火线录制保存视频?操作方法...

    在Win10电脑上玩穿越火线,遇到精彩时刻我们都会录制下,好跟朋友分享,但是在Win10电脑上穿越火线录制保存之后的视频,在哪看呢?有很多用户都不知道怎么在Win10电脑查看这个穿越火线录制保存的视频 ...

  9. 怎么在计算机里找到CF里保存的视频,Win10电脑上查看穿越火线录制保存视频的具体方法...

    在Win10电脑上玩穿越火线,遇到精彩时刻我们都会录制下,好跟朋友分享,但是在Win10电脑上穿越火线录制保存之后的视频,在哪看呢?有很多用户都不知道怎么在Win10电脑查看这个穿越火线录制保存的视频 ...

  10. 使用opencv调用摄像头然后录制视频和保存文件

    用 OpenCV 开发经常用到摄像头,从 Camera获取图像后用OpenCV的算法进行处理,但是一般我们处理完图像之后,还需要将视频保存下来,比如保存成avi.mp4等格式.怎么保存呢?其实Open ...

最新文章

  1. 5-flutter 布局和列表
  2. CVPR单目深度估计竞赛结果出炉,腾讯光影研究室优势夺冠,成果落地应用
  3. 老男孩Linux运维第41期20170924开班第五周学习重点课堂记录
  4. java实现将A表数据转移到B表_解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表(merge into)...
  5. currentThread的一个复杂案例
  6. VMP分析之VM解码循环与基本架构(一)
  7. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
  8. 指令级别解释对象创建过程和DCL为什么要volatile
  9. 最新28个很棒的 jQuery 教程
  10. SAP Spartacus里unit list tree的页面显示和后台响应数据的对应关系
  11. 如何实现 asp.net core 安全优雅退出 ?
  12. linux打印机怎么设置631端口,设置 Linux 下打印机的几种方式
  13. linux 磁盘清理脚本,磁盘清理脚本
  14. python中用于返回元组中元素最小值的是_第5章习题
  15. 《普林斯顿微积分读本》笔记-第4章求解多项式的极限问题
  16. Android自学视频百度网盘链接
  17. 【Ceph源码分析】纠删码编码
  18. Oracle 11g 学习笔记-6(触发器、函数、存储过程、程序包)
  19. 畅联“5机”,华为云WeLink勇当数字化联接器
  20. 深圳超美海边烧烤场 深圳户外烧烤攻略

热门文章

  1. 阿里工程师下乡与一个瓜农的“北伐”
  2. Pytorch入门教程学习笔记(六)循环神经网络RNN(学周杰伦写歌)
  3. 海康网络摄像机与电脑交互,有网络和无网络两种方式读取URL视频流,以及无网络情况下配置IP地址
  4. android 全局剪贴板,Android剪贴板详解
  5. 2020年11月最新互联网大厂面试经验分享【网易、阿里、腾讯、京东、百度、爱奇艺、字节、小米、美团、搜狐、58】
  6. c语言中short作用,详解C语言中整数(short,int,long)
  7. TYPE g_date_tbl_typ IS TABLE OF DATE INDEX BY VARCHAR2(1000);
  8. 【TL学习笔记】1:领域自适应(Domain Adaptation)方法综述
  9. 网站死链接检测查询工具
  10. 关于a:hover span和a span:hover的区别