一:WebRTC錄制基本知識
(一)MediaRecoder類基本格式
(二)options限制選項
mimeType:用來指定要錄制的是視頻還是音頻,即錄制的格式是什么,上面的列表中是webm格式的多媒體類型,也可以設置為其他格式,比如mp4。也可以指定編碼方式
(三)MediaRecorder常用API
如果不選擇timeslice,則所有的數據會存儲到一個大的buffer中,設置了timeslice,則會按timeslice分塊存儲數據,存為小塊的數據
stop不會丟棄最后一塊數據,會使得生效存儲下來
isTypeSupported:用來檢查是否支持對應的格式類型
(四)MediaRecorder事件
對於ondataavailable事件:如果指定了timeslice,則會每隔一段時間觸發這個事件,然后對數據進行處理。如果沒有指定timeslice,則會在視頻錄制完成,調用stop結束錄制時去出發這個事件
(五)javascript存儲方式
Blob是一塊高效的存儲區域(無類型的數據緩沖區),可以將整個緩沖區寫入文件中。Blob是ArrayBuffer的封裝,更加高效的處理ArrayBuffer。ArrayBufferView是帶有類型的ArrayBuffer
二:使用MediaRecoder實現錄制和播放
(一)代碼實現

<html> <head> <title> WebRTC get audio and video devices </title> <style> .none { -webkit-filter: none; } .blue { -webkit-filter: blur(3px); } .grayscale { -webkit-filter: grayscale(1); } .invert { -webkit-filter: invert(1); } .sepia { -webkit-filter: sepia(1); } </style> </head> <body> <h1>Index5.html</h1> <div> <table> <tr> <td> <video autoplay playsinline id="player"></video> </td> <td> <video playsinline id="recplayer"></video> </td> <td> <div id="constraints"></div> </td> </tr> <tr> <td> <button id="record">Start Record</button> </td> <td> <button id="recplay" disabled>Start Play</button> </td> <td> <button id="download" disabled>download</button> </td> </tr> </table> </div> </body> <script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script> <script type="text/javascript" src="./js/client5.js"></script> </html>
client5.js實現
'use strict' //視頻錄制 var videoplay = document.querySelector("video#player"); //視頻播放 var recvideoplay = document.querySelector("video#recplayer"); //約束顯示 var divConstraints = document.querySelector("div#constraints"); //--------按鈕 var btnRecord = document.querySelector("button#record"); var btnRecplay = document.querySelector("button#recplay"); var btnDownload = document.querySelector("button#download"); var buffer; //存儲錄制數據 var mediaRecorder; //對象 function start(){ console.log("start......"); if(!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia){ console.log("getUserMedia is not supported!"); }else{ var constraints = { video : { width:320, height:240, frameRate:30, facingMode:"user" }, audio : { noiseSuppression:true, echoCancellation:true }, } navigator.mediaDevices.getUserMedia(constraints) .then(getMediaStream) .catch(handleError); } } function getMediaStream(stream){ window.stream = stream; //將stream變量放入全局中 videoplay.srcObject = stream; //設置采集到的流進行播放 //獲取視頻的track var videoTrack = stream.getVideoTracks()[0]; //只有一個,所以只取一個 var videoConstraints = videoTrack.getSettings(); //獲取約束對象 divConstraints.textContent = JSON.stringify(videoConstraints,null,2); //轉為json } function handleError(err){ console.log(err.name+":"+err.message); } start(); //開始執行邏輯 //---------設置事件:錄制----- //設置數據處理函數 function handleDataAvail(e){ if(e && e.data && e.data.size > 0){ buffer.push(e.data); } } //錄制與停止錄制 function startRecord(){ buffer = []; //定義數據 var options = { mimeType: "video/webm;codecs=vp8" } if(!MediaRecorder.isTypeSupported(options.mimeType)){ //查看是否支持這個類型 console.error("${options.mimeType} is not suppported!"); return; } try{ mediaRecorder = new MediaRecorder(window.stream,options); }catch(e){ console.error("Failed to create MediaRecoder!"); return; } mediaRecorder.ondataavailable = handleDataAvail; mediaRecorder.start(10); //設置時間片存儲數據 } function stopRecord(){ mediaRecorder.stop(); //停止錄制 } btnRecord.onclick = function(){ if(btnRecord.textContent === "Start Record"){ startRecord(); btnRecord.textContent = "Stop Record"; btnRecplay.disabled = true; btnDownload.disabled = true; }else{ stopRecord(); btnRecord.textContent = "Start Record"; btnRecplay.disabled = false; btnDownload.disabled = false; } } //---------設置事件:播放----- btnRecplay.onclick = function(){ var blob = new Blob(buffer,{type: 'video/webm'}); //生成了一個可以處理buffer的對象 recvideoplay.src = window.URL.createObjectURL(blob); //獲取數據所在位置 recvideoplay.srcObject = null; //實時獲取數據時才需要 recvideoplay.controls = true; //進行播放控制,播放與暫停 recvideoplay.play(); //進行播放 } //---------設置事件:下載----- btnDownload.onclick = function(){ var blob = new Blob(buffer,{type: 'video/webm'}); var url = window.URL.createObjectURL(blob); var a = document.createElement("a"); //模擬鏈接,進行點擊下載 a.href = url; a.style.display = "none"; //不顯示 a.download = "video.webm"; a.click(); }
(二)結果顯示
三:WebRTC采集屏幕數據
(一)獲取桌面API
(二)對瀏覽器進行設置(chrome新版本中的功能)
(三)代碼實現
'use strict' //視頻錄制 var videoplay = document.querySelector("video#player"); //視頻播放 var recvideoplay = document.querySelector("video#recplayer"); //約束顯示 var divConstraints = document.querySelector("div#constraints"); //--------按鈕 var btnRecord = document.querySelector("button#record"); var btnRecplay = document.querySelector("button#recplay"); var btnDownload = document.querySelector("button#download"); var buffer; //存儲錄制數據 var mediaRecorder; //對象 function start(){ console.log("start......"); if(!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia){ console.log("getDisplayMedia is not supported!"); }else{ var constraints = { video : true, audio : false } navigator.mediaDevices.getDisplayMedia(constraints) .then(getMediaStream) .catch(handleError); } } function getMediaStream(stream){ window.stream = stream; //將stream變量放入全局中 videoplay.srcObject = stream; //設置采集到的流進行播放 //獲取視頻的track var videoTrack = stream.getVideoTracks()[0]; //只有一個,所以只取一個 var videoConstraints = videoTrack.getSettings(); //獲取約束對象 divConstraints.textContent = JSON.stringify(videoConstraints,null,2); //轉為json } function handleError(err){ console.log(err.name+":"+err.message); } start(); //開始執行邏輯 //---------設置事件:錄制----- //設置數據處理函數 function handleDataAvail(e){ if(e && e.data && e.data.size > 0){ buffer.push(e.data); } } //錄制與停止錄制 function startRecord(){ buffer = []; //定義數據 var options = { mimeType: "video/webm;codecs=vp8" } if(!MediaRecorder.isTypeSupported(options.mimeType)){ //查看是否支持這個類型 console.error("${options.mimeType} is not suppported!"); return; } try{ mediaRecorder = new MediaRecorder(window.stream,options); }catch(e){ console.error("Failed to create MediaRecoder!"); return; } mediaRecorder.ondataavailable = handleDataAvail; mediaRecorder.start(10); //設置時間片存儲數據 } function stopRecord(){ mediaRecorder.stop(); //停止錄制 } btnRecord.onclick = function(){ if(btnRecord.textContent === "Start Record"){ startRecord(); btnRecord.textContent = "Stop Record"; btnRecplay.disabled = true; btnDownload.disabled = true; }else{ stopRecord(); btnRecord.textContent = "Start Record"; btnRecplay.disabled = false; btnDownload.disabled = false; } } //---------設置事件:播放----- btnRecplay.onclick = function(){ var blob = new Blob(buffer,{type: 'video/webm'}); //生成了一個可以處理buffer的對象 recvideoplay.src = window.URL.createObjectURL(blob); //獲取數據所在位置 recvideoplay.srcObject = null; //實時獲取數據時才需要 recvideoplay.controls = true; //進行播放控制,播放與暫停 recvideoplay.play(); //進行播放 } //---------設置事件:下載----- btnDownload.onclick = function(){ var blob = new Blob(buffer,{type: 'video/webm'}); var url = window.URL.createObjectURL(blob); var a = document.createElement("a"); //模擬鏈接,進行點擊下載 a.href = url; a.style.display = "none"; //不顯示 a.download = "video.webm"; a.click(); }