使用HTML5捕捉音频与视频信息概述及实例

本文概述

长期以来,音频与视频信息的捕捉一直是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属性添加一个新的属性值。

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

复制代码 代码如下:

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

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

复制代码 代码如下:

<input type="file" accept="video/*;capture=camcorder">

<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元素的使用方法如下所示。

复制代码 代码如下:

<device type="media" onchange="update(this.data)"></device>

<video autoplay></video>

<script>

function update(stream) {

document.querySelector('video').src = stream.url;

}

</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方法。

复制代码 代码如下:

function hasGetUserMedia() {

//请注意:在Opera浏览器中不使用前缀

return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||

navigator.mozGetUserMedia || navigator.msGetUserMedia);

}

if (hasGetUserMedia()) {

alert('您的浏览器支持getUserMedia方法');

}

else {

alert('您的浏览器不支持getUserMedia方法');

}

获取访问设备的权限

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

复制代码 代码如下:

<video autoplay id="video"></video>

<script>

var onFailSoHard = function() {

alert('设备拒绝访问');

};

//不使用供应商前缀

navigator.getUserMedia({video: true, audio: true}, function(localMediaStream) {

var video = document.getElementById('video');

video.src = window.URL.createObjectURL(localMediaStream);

//请注意:当使用getUserMedia方法时,在Chrome浏览器中不触发onloadedmetadata事件

video.onloadedmetadata = function(e) {

//后续代码略

};

}, onFailSoHard);

</script>

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

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

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

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

复制代码 代码如下:

window.URL = window.URL || window.webkitURL;

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||

navigator.mozGetUserMedia || navigator.msGetUserMedia;

var video = document.getElementById('video');

if (navigator.getUserMedia) {

navigator.getUserMedia({audio: true, video: true}, function(stream) {

video.src = window.URL.createObjectURL(stream);

}, onFailSoHard);

}

else {

alert('您的浏览器不支持getUserMedia方法');

}

安全性

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

拍照

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

复制代码 代码如下:

<video autoplay></video>

<img src="" id="img" ></img>

<canvas style="display:none;" id="canvas" ></canvas>

var video = document.getElementById('video');

var canvas = document.getElementById('canvas');

var ctx = canvas.getContext('2d');

var localMediaStream = null;

function snapshot() {

if (localMediaStream) {

ctx.drawImage(video, 0, 0);

document.getElementById('img').src = canvas.toDataURL('image/png');

}

}

video.addEventListener('click', snapshot, false);

//不使用供应商前缀

navigator.getUserMedia({video: true}, function(stream) {

video.src = window.URL.createObjectURL(stream);

localMediaStream = stream;

}, onFailSoHard);

应用CSS滤镜

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

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

复制代码 代码如下:

<style>

#video3 {

width: 307px;

height: 250px;

background: rgba(255,255,255,0.5);

border: 1px solid #ccc;

}

.grayscale {

-webkit-filter: grayscale(1);

}

.sepia {

-webkit-filter: sepia(1);

}

.blur {

-webkit-filter: blur(3px);

}

...

</style>

<video id="video" autoplay></video>

<script>

var idx = 0;

var filters = ['grayscale', 'sepia', 'blur', 'brightness', 'contrast', 'hue-rotate',

'hue-rotate2', 'hue-rotate3', 'saturate', 'invert', ''];

function changeFilter(e) {

var el = e.target;

el.className = '';

var effect = filters[idx++ % filters.length]; // loop through filters.

if (effect) {

el.classList.add(effect);

}

}

document.getElementById('video').addEventListener('click', changeFilter, false);

</script>

css 如何让背景图片拉伸填充避免重复显示

CSS3 Text Stroke(文本描边)和text-fill-color(文本填充色)调试工具

HTML5 input placeholder 颜色修改示例

html禁止清除input文本输入缓存的两种方法

基于第一个PhoneGap(cordova)的应用详解

PhoneGap是一套能让你使用HTML5轻松调用本地API接口和发布应用到商店的应用开发平台。官方说有低成本,低开发周期,轻量化等优点,这些咱暂时也没法证明,略过不表。但是有一条跨平台,却是很明显的优势。因为它采用HTML5+JavaScript的模式来开发应用。PhoneGap用JavaScript统一封装了几大平台的本地api(Andriod,IOS,WP8/7,WINRT)等等。。这样的话从一个平台移植到另外一个平台只需要把HTML代码跟JS原封不动的拿过去,打包一下就可以了。PhoneGap后来被Adobe收购,然后又贡献给了开源社区,现在由Apache管理,改名cordova。

html5配合css3实现带提示文字的输入框(摆脱js)

Html5新标签datalist实现输入框与后台数据库数据的动态匹配

html5定位获取当前位置并在百度地图上显示

HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码

将HTML5 Canvas的内容保存为图片借助toDataURL实现

HTML5 canvas基本绘图之绘制阴影效果

HTML5中如何显示视频呢 HTML5视频播放demo

html5 视频播放解决方案

让IE支持HTML5的方法

HTML5之HTML元素扩展(上)―新增加的元素及使用概述

微信浏览器取消缓存的方法

做微信公众号和调试手机页面的时候,避免不了页面要跳转到微信浏览器打开,调试阶段,android版微信浏览器一直都默认缓存html静态资源,每次静态资源变化甚至新内容发布的时候在微信浏览器上都极有可能不能更新,很多时候要清理微信缓存才能看到效果,很是烦人。部分客户装了QQ浏览器,微信实际调用的是QQ浏览器,有时候甚至光清理微信缓存都无效,QQ浏览器的缓存也要清。

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: admin@cnhackhy.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部