html5录像功能限制时间,HTML5拍照和摄像机功能实战详解

开篇

最近在做一个chrome app的云相机应用,应用包括拍照、摄像、保存照片视频、上传文件等等核心功能,其中涉及到很多HTML5对媒体流相关的API。写这篇文章的目的,其一是总结梳理知识点,最重要是希望对有相关需求的读者提供一些指导。

注:本篇文章以实战为准,理论知识不做过多介绍。

拍照

HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头、视频、音频、地理位置等)的接口,基于该接口,开发者可以在不依赖任何浏览器插件的条件下访问硬件媒体设备。

浏览器兼容性如下:

4a2fee0037a87940da0be7c71a965289.png

从上图可以看到,主流浏览器Firefox、Chrome、Safari、Opera等等已经全面支持。

1、获取视频流,并用video标签播放。

--------------------------------------------------------------

const videoConstraints = { width: 1366, height: 768 };

const videoNode = document.querySelector('#video');

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

videoNode.srcObject = stream;

videoNode.play();

2、多个摄像头设备,如何切换?

// enumerateDevices获取所有媒体设备

const mediaDevices = await navigator.mediaDevices.enumerateDevices();

// 通过设备实例king属性videoinput,过滤获取摄像头设备

const videoDevices = mediaDevices.filter(item => item.kind === 'videoinput') || [];

// 获取前置摄像头

const videoDeviceId = videoDevices[0].deviceId;

const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

// 获取后置摄像头

const videoDeviceId = videoDevices[1].deviceId;

const videoConstraints = { deviceId: { exact: videoDeviceId }, width: 1366, height: 768 };

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

// 依次类推...

3、拍照保存图片

// 通过canvas捕捉video流,生成base64格式图片

const canvas = document.createElement('canvas');

const context = canvas.getContext('2d');

canvas.width = 1366;

canvas.height = 768;

context.drawImage(videoNode, 0, 0, canvas.width, canvas.height);

download(canvas.toDataURL('image/jpeg'));

// 下载图片

function download (src) {

if (!src) return;

const a = document.createElement('a');

a.setAttribute('download', new Date());

a.href = src;

a.click();

}

4、关闭摄像头设备

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

// 3s后关闭摄像头

setTimeout(function () {

stream.getTracks().forEach(track => track.stop());

stream = null;

}, 3000);

到此完成简单的相机拍照功能

摄像

摄像基本流程,是录制一段视频流并保存为音视频文件。HTML5 MediaRecorder对象提供了多媒体录音和录视频功能。

浏览器兼容性如下:

0e265439c65196e56558f3f8e4be88cb.png

从上图所示,浏览器对MediaRecorder兼容性远不如getUserMedia,目前只有Chrome、Firefox对MediaRecorder支持较好。

==注意:摄像预览播放器video标签要设置静音muted(消除回声导致的刺耳噪音)==

const videoConstraints = { width: 1366, height: 768 };

let stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: videoConstraints });

let mediaRecorder = new MediaRecorder(stream);

let mediaRecorderChunks = []; // 记录数据流

mediaRecorder.ondataavailable = (e) => {

mediaRecorderChunks.push(e.data);

};

mediaRecorder.onstop = (e) => {

// 通过Blob对象,创建文件二进制数据实例。

let recorderFile = new Blob(mediaRecorderChunks, { 'type' : mediaRecorder.mimeType });

mediaRecorderChunks = [];

const file = new File([this.recorderFile], (new Date).toISOString().replace(/:|\./g, '-') + '.mp4', {

type: 'video/mp4'

});

download(URL.createObjectURL(file));

// 下载视频

function download (src) {

if (!src) return;

const a = document.createElement('a');

a.setAttribute('download', new Date());

a.href = src;

a.click();

}

};

mediaRecorder.stop(); // 停止录制,触发onstop事件

总结

通过以上实战,相信读者已经掌握基础相机功能,拍照、摄像、保存文件等。由于应用项目非个人项目,源码不公开,有兴趣的朋友,不妨动手一试。

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

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

相关文章

选择Vert.x的3个理由

Vert.x是用于JVM的轻量级高性能应用程序平台 现代Web应用程序和移动客户端的兴起重新定义了Web服务器的期望。 Node.js是第一个识别范式转换并提供解决方案的技术。 应用程序平台Vert.x借鉴了Node.js的一些创新,并使其在JVM上可用,将新鲜的想法与最复杂…

spring和mybatis的整合开发(基于MapperScannerConfigurer的整合开发(适用于复杂项目,接口较多的情况))...

在实际项目中,Dao层会包含很多接口,这样会导致spring配置文件过于臃肿。这时就需要采用扫描包的形式来配置mybaits中的映射器。 采用MapperScannerConfigurer来实现。 MapperScannerConfigurer类在spring配置文件中可以配置以下几个属性: 1.b…

页面加载前执行函数

window.onpageshow function(){ var token gg.core.cookie.getValue("token"); console.log(token); if(token ""||token null){ window.location login.html; return; }};转载于:https://www.cnblogs.com/tuhazi/p/987825…

表格对角线两边打字_表格斜线一分为二怎么打字(excel斜杠分割表格打字)

在整理表格的时候,相信许多朋友都会涉及到表格斜线的制作。比如单斜线和双斜线来区分不同维度项目。下面我们就来学习一下,如何通过Excel快速来添加我们的表格斜线。案例一:两步快速制作单表格单斜线第一步:首先在单元格中依次输入…

FROONT – 超棒的可视化响应式网页设计工具

FROONT 是一个基于 Web 的设计工具,在浏览器中运行,使得各类可视化设计的人员都能进行响应式的网页设计,即使是那些没有任何编码技能的设计师。FROONT 使得响应式网页设计能够可视化操作,能够在浏览器中使用直观的拖放工具进行设计…

avalon.js 转义html,avalon模块的内建适配器

text bindings,第一个传参将强制转换为字符串,假值为"",然后变成目标节点的innerText!今天的天气为: $.require("ready,more/avalon", function(){var viewModel {myMessage: $.observable()};$.applyBindin…

参数化的JUnit测试

有时,您会遇到一个问题,就是尖叫使用“参数化”测试,而不是多次复制/粘贴相同的方法。 测试方法基本上是相同的,唯一改变的是传入的数据。在这种情况下,请考虑创建一个利用JUnit中的“ Parameterized ”类的测试用例。…

OO-第一单元总结

经过了前三次作业和两次实验的引导,我的编程思路在逐步从面向过程转向面向对象。也对面向对象有了初步的理解。虽然第一次实验由于自己没有及时完成导致没有提交过有些遗憾,但是第二次实验还是提交了几次的(虽然由于时间原因并没有做好本地测…

kafka数据 落盘_Kafka数据可靠性保证三板斧-ACK/ISR/HW

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源点击右侧关注,大数据开发领域最强公众号!点击右侧关注,暴走大数据!为保证producer发送的数据,能可靠的发送到指定的topic,topic的每…

2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼

转眼又已过去了一年,在这一年里,Firefox 和 Chrome 在拼升级,版本号不断飙升;IE10 随着 Windows 8 在去年10月底正式发布,在 JavaScript 性能和对 HTML5 和 CSS3 的支持方面让人眼前一亮。这篇文章给大家带来《五大主流…

一句话引发的思考 - synchronized/super

https://blog.csdn.net/cool__wang/article/details/52459380#commentBox 转载于:https://www.cnblogs.com/rainydayfmb/p/9883864.html

计算机科学方向的会议或期刊,计算机顶会和顶刊_计算机顶会_顶会

《计算机应用研究》正刊和增刊什么区别,是不是增刊不是正规的核心期刊,求...展开全部《计算机应用研究》是核心期刊,其增刊一年只出版一或两期,和月刊一样具有相同复的正式出版刊号。正刊和增刊的区别如下:1、目的用途…

PAT L3-007 天梯地图

https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线;一条是最短距离的路线…

JavaFX中的塔防(4)

好的,到目前为止,我们已经创建了一个TileMap,将其显示在屏幕上,并使其在第一部分中可编辑。 在第二部分中,我们使用A *算法实现了攻击路径的计算,并使敌人跟随该路径。 在第三部分中,我们创建了…

Two.js – 为现代浏览器而生的 2D 绘图 API

Two.js 是面向现代 Web 浏览器的一个二维绘图 API。Two.js 可以用于多个场合:SVG,Canvas 和 WebGL,旨在使平面形状和动画的创建更方便,更简洁。 Two.js 有一个内置的动画循环,可搭配其他动画库。Two.js 包含可伸缩矢量…

apache arm 交叉编译_MacOS 下交叉编译的折腾笔记

这是这个系列 “折腾笔记” 的第一篇,希望能用更直白的方式去展现交叉编译的时候做了些什么。因此,这个教程并不是最佳实践,但是可以让小伙伴们有一个更直白的理解。之后,我会把笔记的重点放在 bazel 上交叉编译的最佳实践&#x…

python - 使用traceback获取详细的异常信息

try: 1/0except Exception,e: print e 输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错。下面使用traceback模块 import tracebacktry: 1/0except Exception,e: traceback.print_exc() 输…

计算机科学研究生规划,2019计算机考研备考:计算机科学与技术研究方向及复习规划...

考研之路永远都不是轻松着度过的,想要在这条道路上稳稳妥妥的走完,并到达设立在远处的目标,了解目标专业的各项考研备考信息是第一步。新东方在线为大家整理了2019计算机考研备考:计算机科学与技术研究方向及复习规划,…

快速的远程服务测试

测试与远程服务交互的代码通常很困难。 有很多折衷因素会影响您可以编写哪些测试以及要编写的测试数量。 在大多数情况下,您对从服务中获取的数据的控制为零,这使得断言至少很难说。 不久前,我使用VCR库针对远程服务编写了一些Ruby测试。 VC…

树-二叉树、满二叉树和完全二叉树

树-二叉树、满二叉树和完全二叉树 二叉树的定义: (1)当n0时,为空树; (2)当n>0时,是由一个根结点和称为根结点的左、右子树构成,并且两颗子树互不相交。 满二叉树&…