使用HTML 5捕捉音频与视频信息

长期以来,音频与视频信息的捕捉一直是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>
时间: 2024-08-28 18:21:56

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

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

LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SDK,通过一些不同的配置来创建一些客户端/服务器应用程序.例如,如果有一个服务器需要向多个客户端发送音频/视频数据,那么就可以在服务器上创建这样的应用程序,比如多点传送或Web广播中的web多点传播.此外,当有多个捕捉点向一个源发送视频数据时,您可以创建安全/监控应用程序. 产品特征: 视频会议二进制

第五章 音频和视频应用详解(第一篇)

---恢复内容开始--- 5.1处理音频 1.使用<video>元素标记 当前<video>标记支持如下三种格式 Ogg:带有Theora视频编码和vorbis音频的Ogg文件 MPEG4:带有H.264视频编码和Acc音频编码的MPEG4文件 WebM:带有Vp8视频编码和Vorbis音频编码的WebM文件 control:供添加播放.暂停和音量控件 <video>标记允许多个"source"元素,"source元素可以链接不同的视频文件

SWF代码分析与破解之路 (YueTai VIP视频信息获取工具) Socket续篇

引言 上一篇 <Socket与站点保密应用 (隐藏链接的视频下载)>大大咧咧地从 WEB 讲 Socket.再到 TCP/IP 等协议,又再讲到 Wireshark 怎样抓IP包分析.最还要复习一下路由与网络的知识.真的涉及面太广了,仅仅能蜻蜓点水一一带过,只是将多领域的知识串烧也是不错的,能够起到一个归纳的作用.这篇针对 Flash 来进行.写作思路以解决这个问题的过程行为线索. 依次展示怎样使用 Flex Air 的 ServerSocket 和 Socket 实现简化版本号的 HTTP

第 9 章 音频和视频

学习要点: 1.音频和视频概述 2.video 视频元素 3.audio 音频元素 主讲教师:李炎恢 本章主要探讨 HTML5 中音频和视频元素,通过这两个原生的媒体元素向 HTML 页面中嵌入音频和视频. 一.音频和视频概述 首先,我们要理解两个概念:容器(container)和编解码器(codec). 1.视频容器 音频文件或视频文件,都只是一个容器文件.视频文件包含了音频轨道.视频轨道和其他一些元数据.视频播放时,音频轨道和视频轨道是绑定在一起的.元数据包含了视频的封面.标题.子标题.字幕

HTML5音频与视频

HTML5的两个重要元素audio和video,对于这两个元素,HTML5规范提供了通用.完整.可脚本化控制的API. audio元素来播放声音文件或音频流,controls属性用于提供播放.暂停和音量控件,音频不加这个特性,那么页面上任何信息都不会出现,因为音频元素唯一可视化信息就是对于的控制界面.使用source元素来连接到不同的音频文件,浏览器会自动选择第一个可以识别的格式. <audiosrc="samplesong.mp3" controls="control

【FFMpeg视频开发与应用基础】五、调用FFMpeg SDK封装音频和视频为视频文件

<FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK>视频教程已经在"CSDN学院"上线,视频中包含了从0开始逐行代码实现FFMpeg视频开发的过程,欢迎观看!链接地址:FFMpeg视频开发与应用基础--使用FFMpeg工具与SDK 工程代码地址:FFmpeg_Tutorial 音频和视频的封装过程为解封装的逆过程,即将独立的音频数据和视频数据按照容器文件所规定的格式封装为一个完整的视频文件的过程.对于大多数消费者来说,视频封装的容器是大家最为熟悉的,因为它直接

常见图片、音频、视频格式总结

常见图片.音频.视频格式总结 常见图片音频视频格式总结 常见图片格式总结 图片的有损压缩和无损压缩 PSD格式 JPGJPEG 格式 GIF 格式 BMP 格式 PNG 格式 SWF 格式 CDR 格式 AI 格式 TIFF 格式 SVG格式 EPS格式 DXF格式 TGA格式 HDRI格式 RAW格式 EXIF格式 FPX格式 TGA格式 ICO格式图标 PCX格式 常见音频格式总结 1MP3格式 2WMA格式 3WAV格式 4ASF格式 5AAC格式 6Mp3Pro格式 7VQF格式 8FL

第9章 音频和视频

第 9 章音频和视频 学习要点: 1.音频和视频概述 2.video视频元素 3.audio音频元素 本章主要探讨 HTML5中音频和视频元素,通过这两个原生的媒体元素向  HTML页面中 嵌入音频和视频. 一.音频和视频概述 首先,我们要理解两个概念:容器(container)和编解码器(codec). 1.视频容器 音频文件或视频文件,都只是一个容器文件.视频文件包含了音频轨道.视频轨道和其 他一些元数据.视频播放时,音频轨道和视频轨道是绑定在一起的.元数据包含了视频的封 面.标题.子标题.

音频、视频框架概括说明

一.音频基础知识: 1.音频文件的组成:文件格式+音频编码,文件格式用于形容文件本身的格式,音频编码是通过不同编码格式编码后得到的音频数据. 2.音频质量的标准:声卡对声音的处理质量可以用三个基本参数来衡量,即采样频率.采样位数和声道数.采样频率是指单位时间内的采样次数,采样频率越大,采样点之间的间隔就越小,数字化后得到的声音就越逼真.采样位数是记录每次采样值数值大小的位数,采样位数通常有8bits和16bits两种,采样位数越大,所能记录声音的变化度越细腻,相应的数据量就越大.声道数是指处理的