[译] 用HTML5捕获音频和视频
原文地址:http://www.html5rocks.com/en/tutorials/getusermedia/intro/
概述
有了HTML5,我们就可以在不借助Flash或者Silverlight的情况下完成这项工作了。
HTML5能够使我们访问设备的硬件,比如GPS,WebGL等等。
这篇文章,我们就来看看一个新的API——navigator.getUserMedia(),她允许网页应用去访问用户的摄像机和麦克风。
getUserMedia之路
第一阶段:HTML Media Capture
当我们设置<input type="file">标签,并设置此标签的accept属性,她就可以正常的工作了。
<input type="file" accept="image/*;capture=camera"> <!--拍照-->
<input type="file" accept="video/*;capture=camcorder"> <!--摄像-->
<input type="file" accept="audio/*;capture=micophone"> <!--录音-->
这个"API"的短板之处在于她做实时处理的能力比较弱,比如用canvas来渲染和应用于WebGL.
HTML Media Capture只允许你去及时的记录视频和拍照。
第二阶段:device element
很多人认为HTML Media Capture太有局限性了,所以一个强大的支持所有设备的元素出现了。好不惊奇的,她的名字就是<device>,她就是getUserMedia要处理的对象。
Opera、WhatWG、Microsoft等都相继实现此元素与API。
<device>看起来如下:
<device type="media" onchange="update(this.data)"></device>
<video autoplay></video>
<script>
function update(stream){
document.querySelector('video').src = stream.url;
}
</script>
不幸的是,没有发布的浏览器支持此标签。
尽管如此她还是有两个好处的:
- 语义化
 - 高扩展性不仅仅是audio/video.
 
第三阶段:WebRTC
<device>最终还是流产了。
多亏了WebRTC才让需找合适的API的步伐得意继续。
现在的getUserMedia()就是参考的WebRTC,因为这是通往一套API的桥梁。她提供了访问用户本地摄像机和麦克风的能力。
正式开始
特性检查
在使用之前我们应该检查一下我们的设备是否支持此方法。
function hasGetUserMedia(){
    return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
              navigator.mozGetUserMedia || navigator.msGetUserMedia);
}
if(hasGetUserMedia()){
    alert('Good to go!');
}else{
    alert('Not supported!');
}
获得访问设备的权限
我们应当发送允许我们使用设备的请求。getUserMedia的第一个参数是一个对象,保存的是我们想要请求的设备。例如,如果我们想用摄像机和麦克风,第一个参数就是{video: true, audio: ture};
<video autoplay></video>
<script>
var errorCallback = function(e){
console.log('Reeeejected!');
};
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
if(!!navigator.getUserMedia){ //good to go
console.log('Not Suppoted!');
navigator.getUserMedia({video: true, audio: ture}, function(localMediaStream){
var video = document.querySelector('video');
video.src = window.URL.createObjectURL(localMediaStream); video.onloadedmetadata = function(e){
//Do some stuff
};
}, errorCallback);
}
</script>
定制media
getUserMedia的第一个参数也可以被用实现高清等。
var hdConstraints = {
    video: {
        minWidth: 1280,
        minHeight: 720
    }
}
navigator.getUserMedia(hdConstraints, successCallback, errorCallback);
var vgaConstraints = {
    video: {
        mandatory: {
            maxWidth: 640,
            maxHeight: 360
        }
    }
}
navigator.getUserMedia(vgaConstraints, successCallback, errorCallback);
选择媒体源
在Chrome 30之后,我们可以使用MediaStreamTrack.getSources() API来选择video/audio的源。
MediaStreamTrack.getSources(function(sourceInfos){
    var audioSource = null;
    var videoSource = null;
    for(var i=0; i!=sourceInfos.length; ++i){
        var souceInfo = sourceInfos[i];
        if(sourceInfo.kind === 'audio'){
            console.log(sourceInfo.id, sourceInfo.label || 'microphone');
            audioSource = sourceInfo.id;
        }else if(sourceInfo.kind === 'video'){
            console.log(sourceInfo.id, sourceInfo.label || 'camera');
            videoSource = sourceInfo.id;
        }else{
            console.log('Some other kind of source: ', sourceInfo);
        }
    }
    sourceSelected(audioSource, videoSource);
});
function sourceSelected(audioSource, videoSource){
    var constraints = {
        audio: {
            optional: [{sourceId: audioSource}]
        },
        video: {
            optional: [{sourceId: videoSource}]
        }
    };
    navigator.getUserMedia(constraints, successCallback, errorCallback);
}
安全
当我们调用getUserMedia()时,浏览器会弹出一个对话框来让用户决定接下怎么做,不幸的是,当我们的应用使用的是https时,这将会被拒绝。
后备方法
对用不支持getUserMedia的用户来说,我们可以指定一个存在的video或者抛出错误提示。
function fallback(e){
    video.src = 'fallbackvideo.webm';
}
function success(stream){
    video.src = window.URL.createObjectURL(stream);
}
if(!navigator.getUserMedia){
    fallback();
}else{
    navigator.getUserMedia({video: true}, success, fallback);
}
屏幕截图
我们可以使用<canvas>捕获<video>的某一帧,这样就可以实现截图了。
<video autoplay></video>
<img src="">
<canvas style="display:none;"></canvas>
<script>
var video = document.querySelector('video');
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');
var localMediaStream = null; function snapshot(){
if(localMediaStream){
ctx.drawImage(video, 0, 0);
document.querySelector('img').src = canvas.toDataURL('image/webp');
}
} video.addEventListener('click', snapshot, false); navigator.getUserMedia({video: true}, function(stream){
video.src = window.URL.createObjectURL(stream);
localMediaStream = stream;
}, errorCallback);
</script>
应用样式
使用css过滤器
<style>
video {
width: 307px;
height: 250px;
background: rgba(255,255,255,0.5);
border: 1px solid #ccc;
}
.grayscale {
+filter: grayscale(1);
}
.sepia {
+filter: sepia(1);
}
.blur {
+filter: blur(3px);
}
...
</style> <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.querySelector('video').addEventListener(
'click', changeFilter, false);
</script>
WebGL纹理
有兴趣的可以参考http://learningthreejs.com/blog/2012/02/07/live-video-in-webgl/ 这篇文章。
使用Audio API
window.AudioContext = window.AudioContext ||
window.webkitAudioContext; var context = new AudioContext(); navigator.getUserMedia({audio: true}, function(stream) {
var microphone = context.createMediaStreamSource(stream);
var filter = context.createBiquadFilter(); // microphone -> filter -> destination.
microphone.connect(filter);
filter.connect(context.destination);
}, errorCallback);
[译] 用HTML5捕获音频和视频的更多相关文章
- html5之音频、视频(video&audio)
		
音频&视频 本篇为本人的学习笔记. 在Html5之前,浏览器对于视频和音频的处理并没有一个标准.因此在网页中看到的视频,都是通过第三插件的方式嵌入的,如:QuickTime.RealPlaye ...
 - css总结16:HTML5 多媒体音频(Audio)视频(video )
		
1 显示嵌入网页中的 MP3 文件: <embed height="50" width="100" src="horse.mp3"&g ...
 - 在 HTML5 中捕获音频和视频
		
简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...
 - html5音频和视频标签
		
在html5之前的版本中如果想要在网页中插入音频和视频必须要安装插件才可以,比如最常见的flash插件.很多人在刚安装一款浏览器的时候都会遇到浏览器建议安装flash插件,在移动端也是如此.如果想要在 ...
 - html5 音频和视频(audio And video)
		
1.音频和视频 Web 上的视频 直到现在,仍然不存在一项旨在网页上显示视频的标准. 今天,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定 ...
 - 【译】如何使用Vue捕获网络摄像头视频
		
几个月前,我一直关注着比特币的爆发并且在GDAX网站上注册账号.在注册验证的过程中,网站提示要通过计算机的网络摄像头提交我自己的一张照片作为照片ID.这是一个很酷的做法,让我思考一个问题:在网络浏览器 ...
 - html5页面怎么播放音频和视频
		
html5页面怎么播放音频和视频 一.总结 一句话总结:html5 音频和视频标签:(audio And video),局限是不同浏览器对音频视频的格式支持很让人头痛 1.最基础的音频和视频标签的使用 ...
 - HTML5——拖放  地理定位  视频   音频   新的input类型
		
拖放 ————> 设置元素为可拖放 拖动什么 放到何处 进行放置 实例[来回拖放] 地理定位 使用地理定位 处理错误和拒绝 在地图中显示结果 基于脚本的交互式地图 给定位置的信息 用户移动时 ...
 - 20款jQuery 的音频和视频插件
		
分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...
 
随机推荐
- Two Sum III - Data structure design
			
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
 - sqlserver创建同义词
			
https://blog.csdn.net/anderslu/article/details/53433841?utm_source=itdadao&utm_medium=referral 例 ...
 - P2236 [HNOI2002]彩票
			
题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...
 - vyos 基础配置
			
vyos 基础配置 http://www.lowefamily.com.au/2015/11/29/using-a-vyos-router-with-hyper-v/1/http://thomasvo ...
 - MT【141】逆用特征根法
			
(清华大学THUSSAT) 已知 \(a=\left( \dfrac{-1+\sqrt{5}}{2} \right)^{-10}+\left( \dfrac{-1-\sqrt{5}}{2} \righ ...
 - response.sendRedirect()和request.getRequestDispatcher().forward(request,response)的区别
			
转发方式:request.getRequestDispatcher().forward(); 重定向方式:response.sendRedirect(); 下面是HttpServletRespons ...
 - APK反编译之一:基础知识—APK、Dalvik字节码和smali文件
			
refs: APK反编译之一:基础知识http://blog.csdn.net/lpohvbe/article/details/7981386 APK反编译之二:工具介绍http://blog.csd ...
 - MVC中使用RadioButtonFor
			
http://shw3588.blog.163.com/blog/static/6507576201321395845538/ 1 进行初始化 <%=Html.RadioButtonFor(mo ...
 - Chapter2(变量和基础类型)--C++Prime笔记
			
数据类型选择的准则: ①当明确知晓数值不可能为负时,选用无符号类型. ②使用int执行整数运算.在实际应用中,short常常显得太小而long一般和int有一样的尺寸.如果运算范围超过int的表示范围 ...
 - 2017易观OLAP算法大赛
			
大赛简介 目前互联网领域有很多公司都在做APP领域的“用户行为分析”产品,与Web时代的行为分析相类似,其目的都是帮助公司的运营.产品等部门更好地优化自家产品,比如查看日活和月活,查看渠道来源 ...