国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳解js的視頻和音頻采集

2019-11-19 13:18:32
字體:
來源:轉載
供稿:網友

今天要寫的,不是大家平時會用到的東西。因為兼容性實在不行,只是為了說明下前端原來還能干這些事。
大家能想象前端是能將攝像頭和麥克風的視頻流和音頻流提取出來,再為所欲為的么。或者說我想把我canvas畫板的內容錄制成一個視頻,這些看似js應該做不到的事情,其實都是可以做到的,不過兼容性不好。我在這里都是以chrome瀏覽器舉的例子。

這里先把用到的api列一下:

  • getUserMedia:打開攝像頭和麥克風的接口(文檔鏈接)
  • MediaRecorder:采集音視頻流(文檔鏈接)
  • srcObject:video標簽可直接播放視頻流,這是一個大家應該很少用到其實兼容性很好的屬性,推薦大家了解(文檔鏈接)
  • captureStream:可以將canvas輸出流,其實不單單是canvas這里只是舉有這個功能,具體的可以看文檔(文檔鏈接)

1、從攝像頭展示視頻

一、打開攝像頭

// 這里是打開攝像頭和麥克設備(會返回一個Promise對象)navigator.mediaDevices.getUserMedia({ audio: true, video: true}).then(stream => { console.log(stream) // 放回音視頻流}).catch(err => { console.log(err) // 錯誤回調})

上面我們成功打開了攝像頭和麥克風,并獲取到視頻流。那接下來就是要把流呈現到交互界面中了。

二、展示視頻

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body> <video id="video" width="500" height="500" autoplay></video></body><script> var video = document.getElementById('video') navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(stream => { // 這里就要用到srcObject屬性了,可以直接播放流資源 video.srcObject = stream }).catch(err => { console.log(err) // 錯誤回調 })</script>

效果如下圖:

到這里為止我們已經成功的將我們的攝像頭在頁面展示了。下一步就是如何將采集視頻,并下載視頻文件。

2、從攝像頭采集視頻

這里用到的是MediaRecorder對象:

創建一個新的MediaRecorder對象,返回一個MediaStream 對象用來進行錄制操作,支持配置項配置容器的MIME type (例如"video/webm" or "video/mp4")或者音頻的碼率視頻碼率

MediaRecorder接收兩個參數第一個是stream音視頻流,第二個是option配置參數。下面我們可以把上面攝像頭獲取的流加入MediaRecorder中。

var video = document.getElementById('video')navigator.mediaDevices.getUserMedia({ audio: true, video: true}).then(stream => { // 這里就要用到srcObject屬性了,可以直接播放流資源 video.srcObject = stream var mediaRecorder = new MediaRecorder(stream, { audioBitsPerSecond : 128000, // 音頻碼率 videoBitsPerSecond : 100000, // 視頻碼率 mimeType : 'video/webm;codecs=h264' // 編碼格式 })}).catch(err => { console.log(err) // 錯誤回調})

在上面我們創建了MediaRecorder的實例mediaRecorder。接下來就是控制mediaRecorder的開始采集和停止采集的方法了。
MediaRecorder提供了一些方法和事件供我們使用:

  • MediaRecorder.start(): 開始錄制媒體,這個方法調用時可以通過給timeslice參數設置一個毫秒值,如果設置這個毫秒值,那么錄制的媒體會按照你設置的值進行分割成一個個單獨的區塊, 而不是以默認的方式錄制一個非常大的整塊內容.
  • MediaRecorder.stop(): 停止錄制. 同時觸發dataavailable事件,返回一個存儲Blob內容的錄制數據.之后不再記錄
  • ondataavailable事件: MediaRecorder.stop觸發該事件,該事件可用于獲取記錄的媒體(Blob在事件的data屬性中可用作對象)
// 這里我們增加兩個按鈕控制采集的開始和結束var start = document.getElementById('start')var stop = document.getElementById('stop')var video = document.getElementById('video')navigator.mediaDevices.getUserMedia({ audio: true, video: true}).then(stream => { // 這里就要用到srcObject屬性了,可以直接播放流資源 video.srcObject = stream var mediaRecorder = new MediaRecorder(stream, { audioBitsPerSecond : 128000, // 音頻碼率 videoBitsPerSecond : 100000, // 視頻碼率 mimeType : 'video/webm;codecs=h264' // 編碼格式 }) // 開始采集 start.onclick = function () { mediaRecorder.start() console.log('開始采集') } // 停止采集 stop.onclick = function () { mediaRecorder.stop() console.log('停止采集') } // 事件 mediaRecorder.ondataavailable = function (e) { console.log(e) // 下載視頻 var blob = new Blob([e.data], { 'type' : 'video/mp4' }) let a = document.createElement('a') a.href = URL.createObjectURL(blob) a.download = `test.mp4` a.click() }}).catch(err => { console.log(err) // 錯誤回調})

ok,現在執行一波操作;

上圖可以看到結束采集后ondataavailable事件返回的數據中有一個Blob對象,這就是視頻資源了,再接下來我們就可以通過URL.createObjectURL()方法將Blob為url下載到本地了。視頻的采集到下載就結束了,很簡單粗暴。

上面是視頻采集下載的例子,如果只要音頻采集的,同樣道理的設置“mimeType”就好了。這里我就不舉例了。下面我在介紹將canvas錄制為一個視頻文件

2、canvas輸出視頻流

這里用到的是captureStream方法,將canvas輸出流,再用video展現,或者用MediaRecorder采集資源也是可以的。

// 這里就閑話少說直接上重點了因為和上面視頻采集的是一樣的道理的。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body> <canvas width="500" height="500" id="canvas"></canvas> <video id="video" width="500" height="500" autoplay></video></body><script> var video = document.getElementById('video') var canvas = document.getElementById('canvas') var stream = $canvas.captureStream(); // 這里獲取canvas流對象 // 接下來你先為所欲為都可以了,可以參考上面的我就不寫了。</script>

下面我再貼一個gif(這是結合我上次寫的canvas事件的demo結合這次視頻采集的結合)傳送門(Canvas事件綁定)

希望大家可以實現下面的效果,其實還可以在canvas視頻里插入背景音樂什么的,這些都比較簡單。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖西县| 特克斯县| 贵溪市| 垫江县| 绥江县| 望奎县| 虞城县| 天镇县| 赣州市| 宁德市| 竹溪县| 勐海县| 桂东县| 光山县| 安乡县| 泽州县| 唐山市| 东乡县| 布尔津县| 麻江县| 汝阳县| 清原| 德安县| 丰都县| 翁源县| 工布江达县| 东港市| 江西省| 石家庄市| 葫芦岛市| 高邮市| 紫阳县| 弥勒县| 成都市| 惠东县| 阿拉善右旗| 米脂县| 贡山| 凌海市| 兰西县| 苍南县|