网页打开摄像头录制视频,下载和上传,支持手机端

直接复制就可以用,上传自己改路径 

<!DOCTYPE html>
<html><head><title>video recoder</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /></head><style>body {background-color: #efedef;}</style><body><article style="border: 1px solid white; width: 400px; height: 400px; margin: 0 auto; background-color: white"><section class="experiment" style="width: 320px; height: 240px; border: 1px solid green; margin: 50px auto"><div id="videos-container" style="width: 320px; height: 240px"></div></section><section class="experiment" style="text-align: center; border: none; margin-top: 20px"><button id="openCamera">打开摄像头</button><button id="start-recording" disabled>开始录制</button><button id="save-recording" disabled>保存</button><!--<a href="javascript:void(0)" οnclick="send()">发送</a>--></section></article><script>var mediaStream;var recorderFile;var stopRecordCallback;var openBtn = document.getElementById('openCamera');var startBtn = document.getElementById('start-recording');var saveBtn = document.getElementById('save-recording');openBtn.onclick = function () {this.disabled = true;startBtn.disabled = false;openCamera();};startBtn.onclick = function () {this.disabled = true;startRecord();};saveBtn.onclick = function () {saver();// alert('Drop WebM file on Chrome or Firefox. Both can play entire file. VLC player or other players may not work.');};var mediaRecorder;var videosContainer = document.getElementById('videos-container');function openCamera() {var len = videosContainer.childNodes.length;for (var i = 0; i < len; i++) {videosContainer.removeChild(videosContainer.childNodes[i]);}var video = document.createElement('video');var videoWidth = 320;var videoHeight = 240;video.controls = false;video.muted = true;video.width = videoWidth;video.height = videoHeight;MediaUtils.getUserMedia(true, false, function (err, stream) {if (err) {throw err;} else {// 通过 MediaRecorder 记录获取到的媒体流console.log();mediaRecorder = new MediaRecorder(stream);mediaRecorder.blobs = [];mediaStream = stream;var chunks = [],startTime = 0;video.srcObject = stream;video.play();videosContainer.appendChild(video);mediaRecorder.ondataavailable = function (e) {mediaRecorder.blobs.push(e.data);chunks.push(e.data);};mediaRecorder.onstop = function (e) {console.log('mediaRecorder.mimeType', mediaRecorder.mimeType);recorderFile = new Blob(chunks, { type: 'video/mp4' });chunks = [];if (null != stopRecordCallback) {stopRecordCallback();}};}});}// 停止录制function stopRecord(callback) {stopRecordCallback = callback;// 终止录制器mediaRecorder.stop();// 关闭媒体流MediaUtils.closeStream(mediaStream);}var MediaUtils = {/*** 获取用户媒体设备(处理兼容的问题)* @param videoEnable {boolean} - 是否启用摄像头* @param audioEnable {boolean} - 是否启用麦克风* @param callback {Function} - 处理回调*/getUserMedia: function (videoEnable, audioEnable, callback) {navigator.getUserMedia =navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || window.getUserMedia;var constraints = { video: videoEnable, audio: audioEnable };if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {callback(false, stream);})['catch'](function (err) {callback(err);});} else if (navigator.getUserMedia) {navigator.getUserMedia(constraints,function (stream) {callback(false, stream);},function (err) {callback(err);});} else {callback(new Error('Not support userMedia'));}},/*** 关闭媒体流* @param stream {MediaStream} - 需要关闭的流*/closeStream: function (stream) {if (typeof stream.stop === 'function') {stream.stop();} else {let trackList = [stream.getAudioTracks(), stream.getVideoTracks()];for (let i = 0; i < trackList.length; i++) {let tracks = trackList[i];if (tracks && tracks.length > 0) {for (let j = 0; j < tracks.length; j++) {let track = tracks[j];if (typeof track.stop === 'function') {track.stop();}}}}}},};function startRecord() {mediaRecorder.start();setTimeout(function () {// 结束stopRecord(function () {alert('录制成功!');openBtn.disabled = false;saveBtn.disabled = false;//send();});}, 5000);}function saveAs(url, filename = '文件名') {let a = document.createElement('a'); //创建a标签a.setAttribute('href', url); //设置文件下载地址a.setAttribute('target', '_blank'); //在当前页面创建下载a.download = filename;document.body.appendChild(a); //添加到bodya.click(); //触发事件document.body.removeChild(a); //移除标签}function saver() {var file = new File([recorderFile], 'msr-' + new Date().toISOString().replace(/:|\./g, '-') + '.mp4', {type: 'video/mp4',});const url = URL.createObjectURL(recorderFile);saveAs(url, file.name);}function send() {var file = new File([recorderFile], 'msr-' + new Date().toISOString().replace(/:|\./g, '-') + '.mp4', {type: 'video/mp4',});var data = new FormData();data.append('username', 'test');data.append('userfile', file);var req = new XMLHttpRequest();req.open('POST', 'com.spinsoft.bip.frame.utils.image.saveMp4.biz.ext');req.send(data);}</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机之运动状态篇

悬停 悬停状态是四旋无人机具有的一个显著特点。在悬停状态下&#xff0c;四个旋翼具有相等的转速&#xff0c;产生的上升合力正好与自身重力相等&#xff0c;并且因为旋翼转速大小相等&#xff0c;前后端转速方向相反&#xff0c;从而使得飞行器总扭矩为0&#xff0c;使得飞行…

揭秘!电路仿真软件为何成为老师教学新宠?

在数字化浪潮席卷全球的背景下&#xff0c;教育领域也迎来了前所未有的变革。近年来&#xff0c;电路仿真软件在教学中的应用越来越广泛&#xff0c;受到了老师们的热烈追捧。那么&#xff0c;究竟是什么让老师们对电路仿真软件情有独钟呢&#xff1f;今天&#xff0c;就让我们…

nginx的vim nginx.conf配置文件内容详解及实验,nginx的优化和防盗链

一、nginx网络服务器&#xff1a; 1. nginx是开源的&#xff0c;是一款高性能&#xff0c;轻量级的web服务软件&#xff1b;稳定性高&#xff0c;而且版本迭代比较快&#xff1b;修复bug速度比较快&#xff0c;安全性高&#xff1b;消耗资源低&#xff0c;http的请求并发连接&…

探索指针(4)-C语言

目录 1.回调函数 一.回调函数的基本概念 二.示例 三.详细说明 2.qsort使用举例 一.qsort 函数原型 二.参数解释 三.比较函数 3.qsort函数的模拟实现 一.代码示例&#xff1a; 二.分段讲解代码 1.回调函数 一.回调函数的基本概念 回调函数本质上是一种通过函数指…

将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小

将堆内存的最小值&#xff08;Xms&#xff09;与最大值&#xff08;Xmx&#xff09;设置为相同的配置&#xff0c;可以防止JVM在运行过程中根据需要动态调整堆内存大小&#xff0c;从而避免因内存分配策略变化引起的性能波动&#xff0c;也就是所谓的"内存震荡"&…

RH442 开放研究实验: 选择性能监控工具

开放研究实验: 选择性能监控工具 任务执行清单 在本实验中&#xff0c;您将使用各种系统监控工具来观察系统表现。 成果 您应能够&#xff1a; 安装和配置 sysstat 软件包&#xff0c;以生成系统活动报告。安装和配置 Performance Co-Pilot&#xff0c;以采集原始数据来监…

流量攻击是什么意思?

对于多数的互联网企业都会受到流量攻击&#xff0c;那流量攻击是什么意思呢&#xff1f; 流量攻击一般是利用合理的服务请求来占用过多的服务器资源&#xff0c;从而导致正常合法的用户请求没有办法得到服务的响应&#xff0c;使服务无法进行正常的工作运行&#xff0c;流量攻击…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S08(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、时钟配置: 2)、SPI配置: 四、部分软件: 1)、main主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file :…

python实现CRC32计算

文章目录 计算法查表法测试验证 crc基础相关内容可参考&#xff1a; https://blog.csdn.net/xiaoyuanwuhui/article/details/131259671 计算法 # 将32位数据逆序排列 def reverse32(x):x (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1))x (((x &…

【7】ExternalCommand

文章目录 ExternalCommandProcessComponent(服务端)输入输出 external_command_demo&#xff08;客户端&#xff09;插件ActionCommandProcessor ExternalCommandProcessComponent(服务端) 输入 用户业务模块发送的命令为apollo::external_command::ExternalCommandProcessCo…

I2C bus,adaptor,client 在sysfs 的路径定位

i2c bus 路径 struct bus_type i2c_bus_type {.name "i2c",.match i2c_device_match,.probe i2c_device_probe,.remove i2c_device_remove,.shutdown i2c_device_shutdown, }; EXPORT_SYMBOL_GPL(i2c_bus_type);static int __init i2c_init(void) {int re…

使用ref定义响应式数据变量

Ref 使用 Ref 可以方便地创建和管理Vue组件中的响应式数据。例如&#xff0c;如果你有一个计数器组件&#xff0c;你可以使用 Ref 来创建一个响应式的计数器变量&#xff0c;然后在组件内部或外部修改这个变量的值&#xff0c;而不需要手动触发视图更新。 先声明一个变量&…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件&#xff0c;它提供了强大的图像编辑工具和智能自动化功能&#xff0c;包括图像修复、色彩校正和滤镜效果&#xff0c;以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

JavaScript之深入对象,详细讲讲构造函数与常见内置构造函数

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家详细讲讲构造函数与常见内置构造函数&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家&#xff0c;欢迎…

提升效率:快速绘制线框图的技巧

1、什么是线框 线框作为项目开始时的蓝图或示意图&#xff0c;可以帮助我们更清晰地向相关客户呈现相应的程序或网站的框架结构。从更深层次上讲&#xff0c;线框图代表了产品的基本设计布局&#xff0c;承载着界面显示的关键信息&#xff0c;绘制着要开发的应用程序或网站界面…

【NPU成为边缘智能新思路】

在人工智能&#xff08;AI&#xff09;技术日新月异的今天&#xff0c;从云端到边缘的计算需求不断攀升&#xff0c;为各行各业带来了前所未有的变革机遇。作为这一领域的领军者&#xff0c;Arm 公司凭借其卓越的节能技术和从云到边缘的广泛布局&#xff0c;正逐步构建着未来AI…

LeetCode题练习与总结:二叉树的后序遍历--145

一、题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a…

AVR晶体管测试仪开源制作与验证

AVR晶体管测试仪开源制作与验证 &#x1f4cd;原项目地址&#xff1a;https://www.mikrocontroller.net/articles/AVR_Transistortester github地址&#xff1a;https://github.com/Mikrocontroller-net/transistortester &#x1f388;EasyEDA项目地址&#xff1a;https://osh…

《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现3

1.线性表的顺序存储表示 2.顺序表示意图 定义变量的时候才会分配空间&#xff0c;光有类型是不分配空间的 3.顺序表的基本操作 增删查三种较难&#xff0c;后面会讲 4.预定义常量和类型 5.算法一&#xff1a;线性表的初始化 6.线性表的几个简单操作 7.算法二&#xff1a;顺序…

鸿蒙自定义dialog弹窗及传参操作

第一步定义一个dialog&#xff1a; CustomDialog export struct InputDialog {controller: CustomDialogController;State counter: string "10";changeInputValue: Function (value: string) > {}build() {Column() {TextArea({ text: this.counter, placehol…