溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

無需Flash錄視頻——HTML5中級進階

發(fā)布時間:2020-07-28 13:14:43 來源:網(wǎng)絡(luò) 閱讀:495 作者:MaxLeap 欄目:移動開發(fā)

視頻采集

本篇介紹的栗子 都是在chrome 47 版本以上的,低版本的可能會出現(xiàn)白屏和錯誤。

1.安全環(huán)境

隨著Chrome版本的升高,安全性問題也越來越被重視,較新版本的Chrome瀏覽器在調(diào)用一些API時需要頁面處在安全環(huán)境中。本篇文章所介紹的API函數(shù),都需要在安全環(huán)境中執(zhí)行。如果處在非安全環(huán)境下 ( http頁面 ) 這些API就會有意想不到的問題。

比如 getUserMedia()就會報出警告,并執(zhí)行出錯。

而在設(shè)備枚舉enumerateDevices()時,雖然不會報錯,但是他隱藏了設(shè)備label。

注意:第一次在一個安全頁面下執(zhí)行enumerateDevices()時也會隱藏label,在允許使用攝像頭等設(shè)備后,第二次執(zhí)行才會顯示label。

getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. Seehttps://goo.gl/rStTGz for more details.

根據(jù)谷歌的意思,常用的安全環(huán)境有如下

  • http://localhost

  • http://127.0.0.1

  • https 開頭的地址頁面

如果你做了一個視頻測試的頁面,想嘚瑟給局域網(wǎng)的其他人,但是又沒有域名證書怎么辦?

這時候只能通過修改其他人的hosts文件了

比如你的測試服務(wù)器IP地址是192.168.2.18,那么其他人的hosts文件修改如下:

#localhost 127.0.0.1
localhost 192.168.2.18

當使用別人的Chrome瀏覽器訪問 http://localhost/[getUserMediaTestPage]時,就會順利的執(zhí)行這些API了。

但是移動端的瀏覽器并不認localhost,就算你修改了hosts ,移動端的瀏覽器根本不理你,解析都不解析。

所以想在手機上測試,只能老老實實申請個證書了。

2.設(shè)備枚舉

在開啟攝像頭之前,先要把可以使用的麥克風和攝像頭 ( 輸入設(shè)備 ) 列出來,如果沒有這兩樣設(shè)備也就無法繼續(xù)。

代碼如下:

<label for="audioDevice"> 錄音設(shè)備: </label>
<select id="audioDevice">

</select>
<br>
<label for="videoDevice"> 錄影設(shè)備: </label>
<select id="videoDevice">

</select>

<script>
navigator.mediaDevices.enumerateDevices().then(function (data) {
  data.forEach(function (item) {
    if(item.kind=="audioinput"){ //麥克風
     document.getElementById("audioDevice").innerHTML +=  "<option value='"+ item.deviceId +"'>" + item.label + " </option> "
    }else if(item.kind=="videoinput"){ //攝像頭
     document.getElementById("videoDevice").innerHTML +=  "<option value='"+ item.deviceId +"'>" + item.label + " </option> "
    }
  })
},function (error) {
  console.log(error);
})
</script>

效果如下圖,和瀏覽器自己獲取的一模一樣。

無需Flash錄視頻——HTML5中級進階

注意:上圖的實例中,瀏覽器地址欄最右邊的攝像頭標識是需要使用 getUserMedia()函數(shù)時才會出現(xiàn)。

<script>
  var getUserMedia = navigator.webkitGetUserMedia; //Chrome瀏覽器的方法
    getUserMedia.call(navigator, {
      video:true, // 開啟音頻
      audio:true  // 開啟視頻
    }, function(stream){
        console.log(stream); // 成功獲取媒體流
    }, function(error){
        //處理媒體流創(chuàng)建失敗錯誤
    });
</script>

這時候可以通過瀏覽器給出的菜單下拉選擇設(shè)備。

3.設(shè)置參數(shù),預覽

我們可以通過代碼來指定使用哪個攝像頭和麥克風設(shè)備。

也可以通過代碼設(shè)置視頻的寬、高和幀率。

代碼如下:

<video id="video" autoplay></video> <!-- 一定要有 autoplay -->

<script>
var getUserMedia = navigator.webkitGetUserMedia ;

getUserMedia.call(navigator, {
  "audio":{
    "mandatory":{
      "sourceId":"" // 指定設(shè)備的 deviceId
    }
  },
  "video":{
        "optional":[ 
            {"minWidth":400},
            {"maxWidth":400},  // 數(shù)字類型,固定寬度
            {"minHeight":220}, 
      {"maxHeight":220},  // 數(shù)字類型,固定高度
            {"frameRate":"12"}  // 幀率
        ],"mandatory":{
        "sourceId":"" // 指定設(shè)備的 deviceId
        }
      }
}, function(stream){
    //綁定本地媒體流到video標簽用于輸出
    document.getElementById("video").src = URL.createObjectURL(stream);
}, function(error){
    //處理媒體流創(chuàng)建失敗錯誤
});

</script>

輸出的視頻流通過blob對象鏈接綁定到video標簽輸出。

這個deviceId就是從上文設(shè)備枚舉 enumerateDevices() 獲取到的。

兩種設(shè)備,如果有一個deviceId填寫不正確,就會報出一個DevicesNotFoundError的錯誤。

而且一旦指定了設(shè)備后,瀏覽器自己的設(shè)備選擇就會變成灰色不可選。

視頻的寬高,并不會因為填寫的數(shù)值比例不合法而失真。

比如你設(shè)定了寬度30,高度100,那么他會從視頻中心截取 30x100 的畫面,而不是把原畫面擠壓到這個30x100的尺寸。

效果如下:

無需Flash錄視頻——HTML5中級進階

如果您的預覽一片漆黑,或者只有一個小黑點,那么說明您的攝像頭正在被占用...

吐槽:這個getUserMedia()函數(shù)的參數(shù),w3的官方文檔鏈接如下:

https://www.w3.org/TR/mediacapture-streams/

可是Chrome并沒有遵循它,而且差距還挺大...

視頻保存

1. 格式支持

Chrome瀏覽器是大力推廣webm的視頻格式的。可以用MediaRecorder.isTypeSupported("video/webm")來測試是否支持這種類型的編碼。

如果返回true,那么我們錄制的視頻就可以被保存為這種指定的格式。

如果不指定,那么將會使用瀏覽器自動指定的文件格式。文檔原話如下

If this paramater is not specified, the UA will use a platform-specific default format.

但是這個默認值卻無法直接獲取,全靠猜...

2. 視頻錄制 MediaRecorder

我們使用 MediaRecorder來錄制視頻,參數(shù)是通過getUserMedia()獲取的媒體流。

  • 通過綁定ondataavailable事件,來獲取視頻片段數(shù)據(jù),并在內(nèi)存中累積。

  • 錄制的開始和結(jié)束分別使用 start和stop 函數(shù)。

  • 執(zhí)行start之后會周期性觸發(fā)ondataavailable事件。

  • 執(zhí)行stop之后會停止觸發(fā)ondataavailable事件。

  • 錄制結(jié)束后,把累計的片段數(shù)據(jù)保存為blob對象,并從瀏覽器下載存為視頻文件。

代碼如下:

<script>

var getUserMedia = navigator.webkitGetUserMedia ;
var g_stream = null, g_recorder = null;
function startPreview(){
  getUserMedia.call(navigator, {
  video:true,
  audio:true
  }, function(stream){
      g_stream = stream;
  }, function(error){

  });
}

function stopRecording(){
  g_recorder.stop();
}

function startRecording(){
  var chunks = [];
  g_recorder = new MediaRecorder(g_stream,{mimeType:"video/webm"});
  g_recorder.ondataavailable = function(e) {
    chunks.push(e.data);
  }
  g_recorder.onstop = function(e) {
    var blob = new Blob(chunks, { 'type' : 'video/webm' });
    var audioURL = URL.createObjectURL(blob);
    window.open(audioURL);
  }
  g_recorder.start();
}
</script>

注意:本例并沒有填寫視頻文件頭,所以保存出來的視頻文件沒有時間軌,無法快進和跳躍??梢杂酶袷焦S轉(zhuǎn)

“莫基了”上面有一個錄制音頻的例子 傳送門

這篇文章的DEMO請戳 這里


相關(guān)閱讀

多屏互動——H5中級進階
前端,想說愛你不容易!


作者信息
作者來自力譜宿云 LeapCloud 團隊_UX成員:王詩詩 【原創(chuàng)】

王詩詩,前端新人,專職前端工作兩年。曾供職于AMI做底層軟件開發(fā)。喜歡分析H5代碼,追崇用簡單的CSS,構(gòu)建精美動效,做前端之前,這些是業(yè)余愛好?,F(xiàn)任職于MaxLeap UX 組,負責MaxWon 的開發(fā)和維護?,F(xiàn)熱衷于Real-time WebApp。

作者往期佳作

無需Flash實現(xiàn)圖片裁剪——HTML5中級進階
多屏互動——H5中級進階

力譜宿云 LeapCloud 團隊首發(fā): https://blog.maxleap.cn/archives/1197

歡迎關(guān)注微信訂閱號:MaxLeap_yidongyanfa

無需Flash錄視頻——HTML5中級進階


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI