您好,登錄后才能下訂單哦!
今天要寫的,不是大家平時會用到的東西。因為兼容性實在不行,只是為了說明下前端原來還能干這些事。
大家能想象前端是能將攝像頭和麥克風的視頻流和音頻流提取出來,再為所欲為的么。或者說我想把我canvas畫板的內容錄制成一個視頻,這些看似js應該做不到的事情,其實都是可以做到的,不過兼容性不好。我在這里都是以chrome瀏覽器舉的例子。
這里先把用到的api列一下:
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=h364' // 編碼格式 }) }).catch(err => { console.log(err) // 錯誤回調 })
在上面我們創建了MediaRecorder的實例mediaRecorder。接下來就是控制mediaRecorder的開始采集和停止采集的方法了。
MediaRecorder提供了一些方法和事件供我們使用:
// 這里我們增加兩個按鈕控制采集的開始和結束 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=h364' // 編碼格式 }) // 開始采集 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視頻里插入背景音樂什么的,這些都比較簡單。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。