使用HTML5捕捉音頻與視頻信息概述及實(shí)例
來(lái)源:易賢網(wǎng) 閱讀:1341 次 日期:2016-07-13 14:54:44
溫馨提示:易賢網(wǎng)小編為您整理了“使用HTML5捕捉音頻與視頻信息概述及實(shí)例”,方便廣大網(wǎng)友查閱!

本文概述

長(zhǎng)期以來(lái),音頻與視頻信息的捕捉一直是Web開(kāi)發(fā)中的一個(gè)難點(diǎn)。許多年來(lái),我們一直依賴(lài)瀏覽器插件來(lái)實(shí)現(xiàn)這個(gè)需求。

在HTML 5中,出現(xiàn)了許多可以訪(fǎng)問(wèn)硬件設(shè)備的API,例如訪(fǎng)問(wèn)GPS設(shè)備的Geolocation API、訪(fǎng)問(wèn)accelerometer設(shè)備的Orientation API、訪(fǎng)問(wèn)GPU設(shè)備的WebGL API、訪(fǎng)問(wèn)音頻播放設(shè)備的Web Audio API等等。這些API是非常強(qiáng)大的,因?yàn)殚_(kāi)發(fā)者可以直接通過(guò)編寫(xiě)JavaSccript腳本代碼來(lái)訪(fǎng)問(wèn)底層硬件設(shè)備。

本文介紹一種新的API,該API通過(guò)使用navigatior.getUserMedia()方法來(lái)讓W(xué)eb應(yīng)用程序擁有訪(fǎng)問(wèn)用戶(hù)攝像頭與麥克風(fēng)設(shè)備的能力。

捕捉媒體數(shù)據(jù)的技術(shù)發(fā)展歷史

在過(guò)去幾年里,開(kāi)始出現(xiàn)了在Web應(yīng)用程序中訪(fǎng)問(wèn)客戶(hù)端本地設(shè)備的需求,因此,W3C組織決定組織一個(gè)DAP(Device APIS POLICY)工作小組,來(lái)為該需求的實(shí)現(xiàn)制定一個(gè)統(tǒng)一的標(biāo)準(zhǔn)。

接下來(lái)讓我們來(lái)看看在2011年發(fā)生了哪些事情:

在HTML頁(yè)面文件中實(shí)現(xiàn)媒體數(shù)據(jù)的捕捉

DAP工作小組的第一個(gè)要制定的標(biāo)準(zhǔn)就是如何在Web應(yīng)用程序的HTML頁(yè)面中實(shí)現(xiàn)媒體數(shù)據(jù)的捕捉。他們決定重載類(lèi)型為file的input元素(<input type="file">),并且為accept屬性添加一個(gè)新的屬性值。

如果開(kāi)發(fā)者想實(shí)現(xiàn)用戶(hù)通過(guò)攝像頭進(jìn)行拍照的功能,可以書(shū)寫(xiě)如下所示的代碼。

代碼如下:

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

錄制視頻數(shù)據(jù)與音頻數(shù)據(jù)的代碼與之類(lèi)似:

代碼如下:

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

<input type="file" accept="audio/*;capture=microphone">

在這些代碼中,只需使用file控件(類(lèi)型為file的input元素)即可完成拍照或錄制媒體數(shù)據(jù)的功能。但是在因?yàn)檫@些代碼中尚缺乏一些實(shí)現(xiàn)與之相關(guān)的需求(例如在canvas元素中渲染捕捉到的視頻數(shù)據(jù),或者對(duì)捕捉到的視頻數(shù)據(jù)應(yīng)用WEBGL濾鏡)的能力,所以沒(méi)有得到開(kāi)發(fā)者的廣泛應(yīng)用。

支持瀏覽器:

Android 3.0瀏覽器

Chrome for Android (0.16)

Firefox Mobile 10.0

device元素

如果使用file控件,則捕捉媒體數(shù)據(jù)后對(duì)其進(jìn)行處理的能力是非常有限的,所以出現(xiàn)了一種新的可支持任何設(shè)備的標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)使用device元素。

Opera瀏覽器是第一個(gè)通過(guò)device元素實(shí)現(xiàn)視頻數(shù)據(jù)捕捉的瀏覽器。幾乎在同一天,WhatWG組織決定使用navigator.getUserMedia()方法來(lái)捕捉媒體數(shù)據(jù)。一個(gè)星期后,Opera推出一個(gè)新的支持navigator.getUserMedia()方法的瀏覽器。后來(lái),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>

支持瀏覽器:

不幸的是,目前為止尚沒(méi)有一個(gè)正式版的瀏覽器中支持device元素。

WEBRTC

最近,由于WebRTC(Web Real Time Communication:Web實(shí)時(shí)通信)API的出現(xiàn),媒體數(shù)據(jù)捕捉技術(shù)又有了一個(gè)很大的發(fā)展。Google、Opera、Mozilla等公司均正在努力將其實(shí)現(xiàn)在自己的瀏覽器中。

WebRTC API是一個(gè)與getUserMedia方法緊密相關(guān)的API,它提供一種訪(fǎng)問(wèn)客戶(hù)端本地的攝像頭或麥克風(fēng)設(shè)備的能力。

支持瀏覽器:

目前為止,在Chrome 18版瀏覽器中,在chrome://flags頁(yè)面中進(jìn)行設(shè)置后可使用WebRTC,在Chrome 21版本的瀏覽器中,該API被默認(rèn)使用,不再需要設(shè)置。在Opera 12以上與Firefox 17版本的瀏覽器中默認(rèn)支持WebRTC API。

使用getUserMedia方法

通過(guò)使用getUserMedia方法,我們可以不依靠插件而直接訪(fǎng)問(wèn)客戶(hù)端本地的攝像頭設(shè)備與麥克風(fēng)設(shè)備。

檢測(cè)瀏覽器支持

可以通過(guò)如下所示的方法來(lái)檢測(cè)瀏覽器是否支持getUserMedia方法。

代碼如下:

function hasGetUserMedia() {

//請(qǐng)注意:在Opera瀏覽器中不使用前綴

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

navigator.mozGetUserMedia || navigator.msGetUserMedia);

}

if (hasGetUserMedia()) {

alert('您的瀏覽器支持getUserMedia方法');

}

else {

alert('您的瀏覽器不支持getUserMedia方法');

}

獲取訪(fǎng)問(wèn)設(shè)備的權(quán)限

為了訪(fǎng)問(wèn)客戶(hù)端攝像頭設(shè)備與麥克風(fēng)設(shè)備,我們首先需要獲取權(quán)限。getUserMedia方法的第一個(gè)參數(shù)是一個(gè)用于指定媒體類(lèi)型的對(duì)象。例如,當(dāng)你想訪(fǎng)問(wèn)攝像頭設(shè)備時(shí),第一個(gè)參數(shù)應(yīng)該為{video:true},為了同時(shí)訪(fǎng)問(wèn)攝像頭設(shè)備與麥克風(fēng)設(shè)備,需要使用{video:true,audio:true}參數(shù),代碼如下所示:

代碼如下:

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

<script>

var onFailSoHard = function() {

alert('設(shè)備拒絕訪(fǎng)問(wèn)');

};

//不使用供應(yīng)商前綴

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

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

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

//請(qǐng)注意:當(dāng)使用getUserMedia方法時(shí),在Chrome瀏覽器中不觸發(fā)onloadedmetadata事件

video.onloadedmetadata = function(e) {

//后續(xù)代碼略

};

}, onFailSoHard);

</script>

在這段代碼中,結(jié)合了video元素的使用。請(qǐng)注意我們沒(méi)有使用video元素的src屬性值,而是為video元素指定了一個(gè)引用媒體文件的URL地址,同時(shí)將代表了從攝像頭中所獲取到的視頻數(shù)據(jù)的LocalMediaStream對(duì)象轉(zhuǎn)換為一個(gè)Blob URL。

在這段代碼中,同時(shí)為video元素使用autoplay屬性,如果不使用該屬性,則video元素將停留在所獲取的第一幀畫(huà)面處。

請(qǐng)注意:在Chrome瀏覽器中,如果只使用{audio:true},則引發(fā)BUG,在Opera瀏覽器中,同樣不能使用audio元素。

如果你想讓多個(gè)瀏覽器同時(shí)支持getUserMedia方法,請(qǐng)使用如下所示的代碼:

代碼如下:

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方法');

}

安全性

在有些瀏覽器中,當(dāng)調(diào)用getUserMedia方法時(shí),顯示一個(gè)提示窗口,詢(xún)問(wèn)用戶(hù)是否允許或拒絕訪(fǎng)問(wèn)他們的攝像頭或麥克風(fēng)。

拍照

在Canvas API中,可以使用ctx.drawImage(video,0,0)方法將video元素中的某一幀畫(huà)面輸出到canvas元素中。當(dāng)然,既然我們已經(jīng)將捕捉到的用戶(hù)攝像頭中的圖像信息輸出到video元素中,當(dāng)然也可以將圖像信息通過(guò)video元素輸出到canvas元素中,即實(shí)現(xiàn)實(shí)時(shí)拍照功能,代碼如下所示。

代碼如下:

<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);

//不使用供應(yīng)商前綴

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

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

localMediaStream = stream;

}, onFailSoHard);

應(yīng)用CSS濾鏡

目前為止,可以在Chrome 18以上版本的瀏覽器中使用CSS濾鏡。

通過(guò)CSS濾鏡的使用,我們可以對(duì)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>

更多信息請(qǐng)查看網(wǎng)頁(yè)制作
易賢網(wǎng)手機(jī)網(wǎng)站地址:使用HTML5捕捉音頻與視頻信息概述及實(shí)例
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!
相關(guān)閱讀網(wǎng)頁(yè)制作

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)