音視頻流媒體開發(fā)【七十七】- WebRTC4-音視頻采集和播放

音視頻流媒體開發(fā)-目錄
iOS知識點-目錄
Android-目錄
Flutter-目錄
數(shù)據(jù)結(jié)構(gòu)與算法-目錄
uni-pp-目錄

4. 音視頻采集和播放

有三個案例:

(1)打開攝像頭并將畫面顯示到頁面;

(2)打開麥克風(fēng)并在頁面播放捕獲的聲音?

(3)同時打開攝像頭和麥克風(fēng)峡懈,并在頁面顯示畫面和播放捕獲的聲音

4.1 打開攝像頭

實戰(zhàn):打開攝像頭并將畫面顯示到頁面

效果展示

代碼流程
  1. 初始化button、video控件
  2. 綁定“打開攝像頭”響應(yīng)事件onOpenCamera
  3. 如果要打開攝像頭則點擊 “打開攝像頭”按鈕,以觸發(fā)onOpenCamera事件的調(diào)用
  4. 當(dāng)觸發(fā)onOpenCamera調(diào)用時
    a. 設(shè)置約束條件,即是getUserMedia函數(shù)的入?yún)?br> b. getUserMedia有兩種情況钓觉,一種是正常打開攝像頭臭胜,使用handleSuccess處理;一種是打開攝像頭失敗倍啥,使用handleError處理
    c. 當(dāng)正常打開攝像頭時,則將getUserMedia返回的stream對象賦值給video控件的srcObject即可將視頻顯示出來

示例代碼

4.1 video.html

<!DOCTYPE html>
<!‐‐
* 文件名:video.html
* 功能:獲取視頻并將其顯示到頁面
‐‐>
<html >
  <body >
    <video id="local‐video" autoplay playsinline></video>
    <button id="showVideo" >打開攝像頭</button>
    <p>通過getUserMedia()獲取視頻</p>
  </body>

  <script >
    const constraints = {
      audio: false,
      video: true
    };

    // 處理打開攝像頭成功
    function handleSuccess(stream) {
      const video = document.querySelector("#local‐video");
      video.srcObject = stream;
    }

    // 異常處理
    function handleError(error) {
      console.error("getUserMedia error: " + error);
    }

    function onOpenCamera(e) {
      navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
    }

    document.querySelector("#showVideo").addEventListener("click", onOpenCamera);
  </script>
</html>

4.2 打開麥克風(fēng)

實戰(zhàn):打開麥克風(fēng)并在頁面播放捕獲的聲音

效果展示
代碼流程
  1. 初始化button澎埠、audio控件
  2. 綁定“打開麥克風(fēng)”響應(yīng)事件onOpenMicrophone
  3. 如果要打開麥克風(fēng)則點擊 “打開麥克風(fēng)”按鈕虽缕,以觸發(fā)onOpenMicrophone事件的調(diào)用
  4. 當(dāng)觸發(fā)onOpenCamera調(diào)用時
    a. 設(shè)置約束條件,即是getUserMedia函數(shù)的入?yún)?br> b. getUserMedia有兩種情況蒲稳,一種是正常打開麥克風(fēng)氮趋,使用handleSuccess處理;一種是打開麥克風(fēng)失敗江耀,使用handleError處理
    c. 當(dāng)正常打開麥克風(fēng)時剩胁,則將getUserMedia返回的stream對象賦值給audio控件的srcObject即可將聲音播放出來
示例代碼
4.2 audio.html

</html>
<!DOCTYPE html>
<!‐‐
* 文件名:audio.html
* 功能:打開麥克風(fēng)并在頁面播放捕獲的聲音
‐‐>

<html >
  <body>
    <audio id="local‐audio" autoplay controls>播放麥克風(fēng)捕獲的聲音</audio>
    <button id="playAudio">打開麥克風(fēng)</button>
    <p>通過getUserMedia()獲取音頻</p>
  </body>

  <script>
    // 約束條件
    const constraints = {
      audio: true,
      video: false
    };

    // 處理打開麥克風(fēng)成功
    function handleSuccess(stream) {
      const audio = document.querySelector("#local‐audio");
      audio.srcObject = stream;
    }

    // 異常處理
    function handleError(error) {
      console.error("getUserMedia error: " + error);
    }

    function onOpenMicrophone(e) {
      navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
    }

    document.querySelector("#playAudio").addEventListener("click", onOpenMicrophone);
  </script>
</html>

webrtc獲取音視頻設(shè)備

4.3 打開攝像頭和麥克風(fēng)

同時打開攝像頭和麥克風(fēng),范例可以參考4.1祥国,只是在約束條件中把

const constraints = {
  audio: false, // 不打開麥克風(fēng)
  video: true
};

改為

const constraints = {
  audio: true, // 打開麥克風(fēng)
  video: true
};
具體代碼

4.3 video_audio.html

<!DOCTYPE html>
<!‐‐
* 文件名:video.html
* 功能:獲取音視頻并將其顯示到頁面和播放聲音
‐‐>

<html>
  <body>
    <video id="local‐video" autoplay playsinline></video>
    <button id="showVideo">打開音視頻</button>
    <div id="errorMsg"></div>
    <p>通過 <code>getUserMedia()</code> 獲取音視頻.</p>

    <script>
      // 設(shè)置約束條件, 同時打開音頻流和視頻流
      const constraints = (window.constraints = {
        audio: true,
        video: true
      });

      // 處理打開攝像頭+麥克風(fēng)成功
      function handleSuccess(stream) {
        const video = document.querySelector("#local‐video");
        video.srcObject = stream;
      }

      // 處理打開攝像頭+麥克風(fēng)失敗
      function handleError(error) {
        console.error("getUserMedia error: " + error);
      }

      async function onOpenAV(e) {
        navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
      }

      document
      .querySelector("#showVideo")
      .addEventListener("click", onOpenAV);

    </script>
  </body>
</html>

4.4 拓展講解

  1. getUserMedia API參考:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia

  2. !=和!==區(qū)別
    != 在表達(dá)式兩邊的數(shù)據(jù)類型不一致時,會隱式轉(zhuǎn)換為相同數(shù)據(jù)類型,然后對值進(jìn)行比較. 比如 1 和 "1" , 1 != "1" 為false
    !== 不會進(jìn)行類型轉(zhuǎn)換,在比較時除了對值進(jìn)行比較以外,還比較兩邊的數(shù)據(jù)類型, 它是恒等運算符===的非形式.昵观, 1 != "1" 為true

  3. video控件屬性
    <video>: The Video Embed element https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video
    HTML DOM Video 對象 https://www.runoob.com/jsref/dom-obj-video.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晾腔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啊犬,更是在濱河造成了極大的恐慌灼擂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件觉至,死亡現(xiàn)場離奇詭異缤至,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)康谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門领斥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沃暗,你說我怎么就攤上這事月洛。” “怎么了孽锥?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵嚼黔,是天一觀的道長。 經(jīng)常有香客問我惜辑,道長唬涧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任盛撑,我火速辦了婚禮碎节,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抵卫。我一直安慰自己狮荔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布介粘。 她就那樣靜靜地躺著殖氏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姻采。 梳的紋絲不亂的頭發(fā)上雅采,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音慨亲,去河邊找鬼婚瓜。 笑死,一個胖子當(dāng)著我的面吹牛巡雨,可吹牛的內(nèi)容都是我干的闰渔。 我是一名探鬼主播席函,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼铐望,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起正蛙,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤督弓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乒验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚隧,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年锻全,在試婚紗的時候發(fā)現(xiàn)自己被綠了狂塘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳄厌,死狀恐怖荞胡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情了嚎,我是刑警寧澤泪漂,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站歪泳,受9級特大地震影響萝勤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呐伞,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一敌卓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伶氢,春花似錦假哎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劣砍,卻和暖如春惧蛹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刑枝。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工香嗓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人装畅。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓靠娱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掠兄。 傳聞我的和親對象是個殘疾皇子像云,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容