1. 程式人生 > >使用Chrome采集攝像頭並生成視頻下載

使用Chrome采集攝像頭並生成視頻下載

tle opus alert media vid stream 毫秒 rain query

主要使用2個技術點:WebRtc 的 getUserMedia 和 MediaRecorder

註意點

  • 開始錄制調用 start 方法要傳入一個采樣間隔,這樣錄制的媒體會按照你設置的值進行分割成一個個單獨的區塊, 而不是以默認的方式錄制一個非常大的整塊內容.
  • demo地址:https://young-cowboy.github.io/gallery/MediaRecorder.html

參考資料

  • https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder

代碼如下

<!DOCTYPE html>
<html lang="en"
> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <video width="400" height="300" controls id="video" autoplay></video> <div> <button
type="button" id="record">record</button> <button type="button" id="pause">pause</button> <button type="button" id="resume">resume</button> <button type="button" id="stop">stop</button> <button type="button" id="finish">finish</button>
<a href="#" target="_blank" id="download">download</a> </div> <div> <button type="button" id="info">info</button> <button type="button" id="isTypeSupported">isTypeSupported</button> </div> <script type="text/javascript"> (function () { let mediaRecorder = null; let mediaStream = null; let chunks = []; function getMediaStream(params) { var constraints = { audio: true, video: true }; return navigator .mediaDevices .getUserMedia(constraints); } function attachMedia() { getMediaStream() .then(stream => { document.querySelector(‘#video‘).srcObject = stream; mediaStream = stream; }) .catch(err => alert(`${err.name}: ${err.message}`)); } function record() { mediaRecorder = new MediaRecorder(mediaStream, { mimeType:"video/webm" }); mediaRecorder.addEventListener(‘dataavailable‘, e => { console.log(‘dataavailable %o‘, e); chunks.push(e.data); }); mediaRecorder.addEventListener(‘error‘, e => console.log(‘error %o‘, e)); mediaRecorder.addEventListener(‘pause‘, e => console.log(‘pause %o‘, e)); mediaRecorder.addEventListener(‘resume‘, e => console.log(‘resume %o‘, e)); mediaRecorder.addEventListener(‘start‘, e => console.log(‘start %o‘, e)); mediaRecorder.addEventListener(‘stop‘, e => console.log(‘stop %o‘, e)); // 調用時可以通過給timeslice參數設置一個毫秒值,如果設置這個毫秒值,那麽錄制的媒體會按照你設置的值進行分割成一個個單獨的區塊, 而不是以默認的方式錄制一個非常大的整塊內容. mediaRecorder.start(10); } function stop() { mediaRecorder.stop(); } function pause() { mediaRecorder.pause(); } function resume() { mediaRecorder.resume(); } function stop() { mediaRecorder.stop(); } function download() { var blob = new Blob(chunks, {type: "video/webm"}); chunks = []; var downloadLink = document.querySelector(‘a#download‘); var videoURL = window.URL.createObjectURL(blob); var rand = Math.floor((Math.random() * 10000000)); var name = "video_"+rand+".webm" ; downloadLink.href = videoURL; downloadLink.setAttribute( "download", name); downloadLink.setAttribute( "name", name); } function info() { console.log(`mimeType ${mediaRecorder.mimeType}`); console.log(`state ${mediaRecorder.state}`); console.log(`stream ${mediaRecorder.stream}`); console.log(`videoBitsPerSecond %o`, mediaRecorder.videoBitsPerSecond); console.log(`audioBitsPerSecond ${mediaRecorder.audioBitsPerSecond}`); } function isTypeSupported() { var types = [ "video/webm", "audio/webm", "video/webm\;codecs=vp8", "video/webm\;codecs=daala", "video/webm\;codecs=h264", "audio/webm\;codecs=opus", "video/mpeg" ]; for (var i in types) { console.log(`Is ${types[i]} supported? ${MediaRecorder.isTypeSupported(types[i] ? "Maybe!" : "No")}`); } } document.querySelector(‘#record‘).addEventListener(‘click‘, e => record()); document.querySelector(‘#pause‘).addEventListener(‘click‘, e => pause()); document.querySelector(‘#resume‘).addEventListener(‘click‘, e => resume()); document.querySelector(‘#stop‘).addEventListener(‘click‘, e => stop()); document.querySelector(‘#finish‘).addEventListener(‘click‘, e => download()); document.querySelector(‘#info‘).addEventListener(‘click‘, e => info()); document.querySelector(‘#isTypeSupported‘).addEventListener(‘click‘, e => isTypeSupported()); attachMedia(); })() </script> </body> </html>

使用Chrome采集攝像頭並生成視頻下載