长期以来,音频与视频信息的捕捉一直是Web开发中的一个难点。许多年来,我们一直依赖浏览器插件来实现这个需求。

在HTML 5中,出现了许多可以访问硬件设备的API,例如访问GPS设备的Geolocation API、访问accelerometer设备的Orientation API、访问GPU设备的WebGL API、访问音频播放设备的Web Audio API等等。这些API是非常强大的,因为开发者可以直接通过编写JavaSccript脚本代码来访问底层硬件设备。

本文介绍一种新的API,该API通过使用navigatior.getUserMedia()方法来让Web应用程序拥有访问用户摄像头与麦克风设备的能力。

捕捉媒体数据的技术发展历史

在过去几年里,开始出现了在Web应用程序中访问客户端本地设备的需求,因此,W3C组织决定组织一个DAP(Device APIS POLICY)工作小组,来为该需求的实现制定一个统一的标准。

接下来让我们来看看在2011年发生了哪些事情:

在HTML页面文件中实现媒体数据的捕捉

DAP工作小组的第一个要制定的标准就是如何在Web应用程序的HTML页面中实现媒体数据的捕捉。他们决定重载类型为file的input元素(<input type="file">),并且为accept属性添加一个新的属性值。

如果开发者想实现用户通过摄像头进行拍照的功能,可以书写如下所示的代码。

  1. <input type="file" accept="image/*;capture=camera">

录制视频数据与音频数据的代码与之类似:

  1. <input type="file" accept="video/*;capture=camcorder">
  2. <input type="file" accept="audio/*;capture=microphone">

在这些代码中,只需使用file控件(类型为file的input元素)即可完成拍照或录制媒体数据的功能。但是在因为这些代码中尚缺乏一些实现与之相关的需求(例如在canvas元素中渲染捕捉到的视频数据,或者对捕捉到的视频数据应用WEBGL滤镜)的能力,所以没有得到开发者的广泛应用。

支持浏览器:

  • Android 3.0浏览器
  • Chrome for Android (0.16)
  • Firefox Mobile 10.0

device元素

如果使用file控件,则捕捉媒体数据后对其进行处理的能力是非常有限的,所以出现了一种新的可支持任何设备的标准。该标准使用device元素。

Opera浏览器是第一个通过device元素实现视频数据捕捉的浏览器。几乎在同一天,WhatWG组织决定使用navigator.getUserMedia()方法来捕捉媒体数据。一个星期后,Opera推出一个新的支持navigator.getUserMedia()方法的浏览器。后来,Microsoft工具推出支持该方法的IE 9浏览器。

device元素的使用方法如下所示。

  1. <device type="media" onchange="update(this.data)"></device>
  2. <video autoplay></video>
  3. <script>
  4. function update(stream) {
  5. document.querySelector('video').src = stream.url;
  6. }
  7. </script>

支持浏览器:

不幸的是,目前为止尚没有一个正式版的浏览器中支持device元素。

WEBRTC

最近,由于WebRTC(Web Real Time Communication:Web实时通信)API的出现,媒体数据捕捉技术又有了一个很大的发展。Google、Opera、Mozilla等公司均正在努力将其实现在自己的浏览器中。

WebRTC API是一个与getUserMedia方法紧密相关的API,它提供一种访问客户端本地的摄像头或麦克风设备的能力。

支持浏览器:

目前为止,在Chrome 18版浏览器中,在chrome://flags页面中进行设置后可使用WebRTC,在Chrome 21版本的浏览器中,该API被默认使用,不再需要设置。在Opera 12以上与Firefox 17版本的浏览器中默认支持WebRTC API。

使用getUserMedia方法

通过使用getUserMedia方法,我们可以不依靠插件而直接访问客户端本地的摄像头设备与麦克风设备。

检测浏览器支持

可以通过如下所示的方法来检测浏览器是否支持getUserMedia方法。

  1. function hasGetUserMedia() {
  2. //请注意:在Opera浏览器中不使用前缀
  3. return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
  4. navigator.mozGetUserMedia || navigator.msGetUserMedia);
  5. }
  6. if (hasGetUserMedia()) {
  7. alert('您的浏览器支持getUserMedia方法');
  8. }
  9. else {
  10. alert('您的浏览器不支持getUserMedia方法');
  11. }

获取访问设备的权限

为了访问客户端摄像头设备与麦克风设备,我们首先需要获取权限。getUserMedia方法的第一个参数是一个用于指定媒体类型的对象。例如,当你想访问摄像头设备时,第一个参数应该为{video:true},为了同时访问摄像头设备与麦克风设备,需要使用{video:true,audio:true}参数,代码如下所示:

  1. <video autoplay id="video"></video>
  2. <script>
  3. var onFailSoHard = function() {
  4. alert('设备拒绝访问');
  5. };
  6.  
  7. //不使用供应商前缀
  8. navigator.getUserMedia({video: true, audio: true}, function(localMediaStream) {
  9. var video = document.getElementById('video');
  10. video.src = window.URL.createObjectURL(localMediaStream);
  11.  
  12. //请注意:当使用getUserMedia方法时,在Chrome浏览器中不触发onloadedmetadata事件
  13. video.onloadedmetadata = function(e) {
  14. //后续代码略
  15. };
  16. }, onFailSoHard);
  17. </script>

在这段代码中,结合了video元素的使用。请注意我们没有使用video元素的src属性值,而是为video元素指定了一个引用媒体文件的URL地址,同时将代表了从摄像头中所获取到的视频数据的LocalMediaStream对象转换为一个Blob URL。

在这段代码中,同时为video元素使用autoplay属性,如果不使用该属性,则video元素将停留在所获取的第一帧画面处。

请注意:在Chrome浏览器中,如果只使用{audio:true},则引发BUG,在Opera浏览器中,同样不能使用audio元素。

如果你想让多个浏览器同时支持getUserMedia方法,请使用如下所示的代码:

  1. window.URL = window.URL || window.webkitURL;
  2. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
  3. navigator.mozGetUserMedia || navigator.msGetUserMedia;
  4.  
  5. var video = document.getElementById('video');
  6.  
  7. if (navigator.getUserMedia) {
  8. navigator.getUserMedia({audio: true, video: true}, function(stream) {
  9. video.src = window.URL.createObjectURL(stream);
  10. }, onFailSoHard);
  11. }
  12. else {
  13. alert('您的浏览器不支持getUserMedia方法');
  14. }

安全性

在有些浏览器中,当调用getUserMedia方法时,显示一个提示窗口,询问用户是否允许或拒绝访问他们的摄像头或麦克风。如下图所示。

拍照

在Canvas API中,可以使用ctx.drawImage(video,0,0)方法将video元素中的某一帧画面输出到canvas元素中。当然,既然我们已经将捕捉到的用户摄像头中的图像信息输出到video元素中,当然也可以将图像信息通过video元素输出到canvas元素中,即实现实时拍照功能,代码如下所示。

  1. <video autoplay></video>
  2. <img src="" id="img" ></img>
  3. <canvas style="display:none;" id="canvas" ></canvas>
  4.  
  5. var video = document.getElementById('video');
  6. var canvas = document.getElementById('canvas');
  7. var ctx = canvas.getContext('2d');
  8. var localMediaStream = null;
  9.  
  10. function snapshot() {
  11. if (localMediaStream) {
  12. ctx.drawImage(video, 0, 0);
  13. document.getElementById('img').src = canvas.toDataURL('image/png');
  14. }
  15. }
  16.  
  17. video.addEventListener('click', snapshot, false);
  18.  
  19. //不使用供应商前缀
  20. navigator.getUserMedia({video: true}, function(stream) {
  21. video.src = window.URL.createObjectURL(stream);
  22. localMediaStream = stream;
  23. }, onFailSoHard);

应用CSS滤镜

目前为止,可以在Chrome 18以上版本的浏览器中使用CSS滤镜。

通过CSS滤镜的使用,我们可以对video元素中捕捉的视频添加各种图像滤镜效果。

  1. <style>
  2. #video3 {
  3. width: 307px;
  4. height: 250px;
  5. background: rgba(255,255,255,0.5);
  6. border: 1px solid #ccc;
  7. }
  8. .grayscale {
  9. -webkit-filter: grayscale(1);
  10. }
  11. .sepia {
  12. -webkit-filter: sepia(1);
  13. }
  14. .blur {
  15. -webkit-filter: blur(3px);
  16. }
  17. ...
  18. </style>
  19.  
  20. <video id="video" autoplay></video>
  21.  
  22. <script>
  23. var idx = 0;
  24. var filters = ['grayscale', 'sepia', 'blur', 'brightness', 'contrast', 'hue-rotate',
  25. 'hue-rotate2', 'hue-rotate3', 'saturate', 'invert', ''];
  26.  
  27. function changeFilter(e) {
  28. var el = e.target;
  29. el.className = '';
  30. var effect = filters[idx++ % filters.length]; // loop through filters.
  31. if (effect) {
  32. el.classList.add(effect);
  33. }
  34. }
  35.  
  36. document.getElementById('video').addEventListener('click', changeFilter, false);
  37. </script>

使用HTML 5捕捉音频与视频信息的更多相关文章

  1. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK

    LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...

  2. Windows Store App 音频和视频

    在Windows应用商店应用中提供了MediaElement控件,该控件能为应用提供音频和视频播放功能.就像之前提到的,虽然在多媒体应用开发中,开发人员可以自行开发一套音频.视频编解码规范和开发媒体播 ...

  3. HTML的音频和视频

    目录 [1]媒体格式 音频格式 视频格式 [2]元素 插件元素 HTML5元素 [3]HTML音频 [4]HTML视频 前面的话 多媒体元素(比如视频和音频)存储于媒体文件中,确定媒体类型的最常用的方 ...

  4. Android四大组件之ContentProvider(二)读取设备上的图片、音频和视频

    Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,通过Content Provider的方式提供给用户.当设备开机或者有SD卡插拔等事件发生时, ...

  5. 富文本编辑器UEditor自定义工具栏(二、插入图片、音频、视频个性化功能按钮和弹层及自定义分页符)

    导读:本篇将简单探讨插入图片.音频.视频的功能按钮实现方式 传送门:富文本编辑器UEditor自定义工具栏(一.基础配置与字体.背景色.行间距.超链接实现) 一.效果图 1.UEditor自定义工具栏 ...

  6. javaweb中上传视频,并且播放,用上传视频信息为例

    1.上传视频信息的jsp页面uploadVideo.jsp <body background="image/bk_hero.jpg"><div id=" ...

  7. Web开发——HTML基础(图像、音频和视频内容)

    参考: 参考:HTML中的图像 参考:视频和音频内容 目录: 1.HTML中的图像 1.1 我们如何在网页上放置图像? (1)替代文字(alt) (2)宽度和高度 (3)图片标题 1.2 用图形和图形 ...

  8. 网页中创建音频、视频和Flash等多媒体:object元素

    <object>元素:它主要用于定义网页中的多媒体,比如音频.视频.Java applets.PDF.ActiveX和Flash.Object标签是成对出现的,在object标签内可以使用 ...

  9. .NET 处理视频-MediaInfo 获取视频信息

    获取视频信息的组件很多,本节介绍的是:MediaFile. 第一步.添加 MediaInfoDotNet 在项目上右键,选择“管理 NuGet 程序包”,浏览以选中 MediaInfoDotNet,然 ...

随机推荐

  1. maven入门基础(转)

    maven介绍 maven是构建工具,也是构建管理工具.ant只是构建工具,因为不支持生成站点功能,只有预处理,编译,打包,测试,部署等功能. maven坐标 groupId:项目组织的逆向域名,比如 ...

  2. WdatePicker 开始日期不能大于结束日期,结束时间不能小于开始时间

    <input class="input_calendar inputcss" id="startDate" runat="server" ...

  3. iOS开发--UIDatePicker

    UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...

  4. php 复习

    <?php 一.php基础语法1.输出语句:echo print print_r var_dump() 2.php是弱类型语言强制转换类型: (类型)变量 settype(变量,类型) 3.变量 ...

  5. 设置tomcat内存设定

    Linux: 在/usr/local/apache-tomcat-/bin 目录下的catalina.sh添加: JAVA_OPTS='-Xms512m -Xmx1024m'要加"m&quo ...

  6. 数据结构和算法 – 3.堆栈和队列

    1.栈的实现   后进先出     自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...

  7. Shell编程基础教程1--Shell简介

    1.Shell简介 1.1.查看你系统shell信息 cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 echo $SHELL 命令可以查看当前你所使用的shell是 ...

  8. I-number

    以下是真坑爹题目: 此题必须输出前导零,否则永远a不了 I-number Time Limit: 5000MS Memory limit: 65536K 题目描述 The I-number of x ...

  9. 获取Windows下某进程监听的TCP/UDP端口

    1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...

  10. Oracle Segments可以跨多个data files吗?

    首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储.每一 ...