【音視頻】WebRTC-Web 音視頻采集與播放

一、打開攝像頭

打開攝像頭首先需要有一個htmlvideo標簽:

  • id = "local-video",是為了后續的js腳本調用這個對象
  • autoplay是設置打開后自動播放,playsinline則是為了兼容移動端
 <video id = "local-video" autoplay playsinline></video>

添加<script>腳本標簽:

  • 需要定義一個constraints對象,內部需要設置音頻和視頻的打開情況,比如這里只打開攝像頭,則:
//媒體限制
const constraints = {audio:false,video:true
};
  • 通過documentquerySelector方法,返回對應標簽id的對象,比如這里要得到<video>標簽,就傳入"#local-video",如果要得到對應的<button>標簽對象,則查找"#showVideoBtn"
const video = document.querySelector("#local-video");
document.querySelector("#showVideoBtn").addEventListener("click",onOpenCamera);
  • 要在點擊按鈕后,打開攝像頭,我們要實現下面三個回調函數:

handleSucess

function handleSuccess(stream){//document是內置全局變量,表示當前HTML文檔,這里是選擇對應的video對象const video = document.querySelector("#local-video"); //#local-video選擇對應的id,返回的是引用video.srcObject = stream; //把視頻流賦值給video對象
}function handleError(error){//console是內置全局變量,表示瀏覽器端的控制臺console.error("getUserMedia error:" + error); //控制臺打印錯誤
}

這個函數在打開攝像頭成功之后調用,會傳入一個stream對象,表示對應的媒體流,我們在這個回調函數中要將媒體流傳入上述<video>標簽對象,具體的方法是賦值<video>對象的srcObject屬性:

video.srcObject = stream;

handleError

function handleError(error){//console是內置全局變量,表示瀏覽器端的控制臺console.error("getUserMedia error:" + error); //控制臺打印錯誤
}

這個函數用于打開攝像頭失敗之后的回調函數,傳入錯誤信息,我們可以在控制臺打印對應的信息:

onOpenCamera

 function onOpenCamera(e){//navigator也是內置全局變量,表示導航對象//mediaDevice是對應的媒體設備對象//getUserMedia是獲取用戶媒體的方法,返回一個Promise對象,promise執行成功后調用then函數,失敗觸發catch函數navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);}

這個函數在我們按鈕點擊后觸發,是按鈕點擊的事件回調函數,傳入一個事件對象,我們可以在這個事件回調函數內部調用navigator對象的mediaDevices.getUserMedia方法,也就是先獲得媒體設備,然后在將我們的媒體限制、回調函數綁定,具體如下:

  • getUserMedia函數返回一個promise對象,這個對象執行完打開攝像頭任務后,會調用對應的函數
    • 如果任務成功,調用then里面的回調函數
    • 如果任務錯誤,調用catch里面的回調函數
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);

最后,我們需要將按鈕的點擊事件回調函數綁定在showVideoBtn

document.querySelector("#showVideoBtn").addEventListener("click",onOpenCamera);

完整代碼如下:

<!DOCTYPE html><html> <body><video id = "local-video" autoplay playsinline></video><button id = "showVideoBtn"> 打開攝像頭</button><p>通過getUserMedia獲取視頻</p></body><script>//媒體限制const constraints = {audio:false,video:true};function handleSuccess(stream){//document是內置全局變量,表示當前HTML文檔,這里是選擇對應的video對象const video = document.querySelector("#local-video"); //#local-video選擇對應的id,返回的是引用video.srcObject = stream; //把視頻流賦值給video對象}function handleError(error){//console是內置全局變量,表示瀏覽器端的控制臺console.error("getUserMedia error:" + error); //控制臺打印錯誤}function onOpenCamera(e){//navigator也是內置全局變量,表示導航對象//mediaDevice是對應的媒體設備對象//getUserMedia是獲取用戶媒體的方法,返回一個Promise對象,promise執行成功后調用then函數,失敗觸發catch函數navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);}//綁定按鈕的點擊事件,點擊后調用onOpenCamera函數document.querySelector("#showVideoBtn").addEventListener("click",onOpenCamera);</script></html>

Web頁面效果如下:

在這里插入圖片描述

二、打開麥克風

打開麥克風和打開攝像頭類似,把對應的<video>標簽改為audio標簽,然后添加上controls模塊,這個模塊是添加一些暫停、聲音調節等功能

<audio id = "local-audio" autoplay controls></audio>

還需要要修改對應的媒體限制對象constraints,關閉video,打開audio

const constraints = {video: false,audio: true
}

其他部分和打開攝像頭保持一致

<!DOCTYPE html>
<html><body><audio id = "local-audio" autoplay controls></audio><button id = "showAudioBtn"> 打開麥克風</button><p>通過getUserMedia獲取音頻</p></body><!--類似video部分的js腳本--><script>const constraints = {video: false,audio: true}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);}showAudioBtn = document.querySelector("#showAudioBtn");showAudioBtn.addEventListener("click",onOpenMicrophone);</script></html>

Web頁面效果如下:

在這里插入圖片描述

三、同時打開攝像頭和麥克風

同時打開攝像頭和麥克風,和打開攝像頭一致,唯一需要修改的就是媒體限制對象constraints,將視頻和音頻都設置為true

const constraints = {video: true,audio: true
}

完整代碼如下:

<!DOCTYPE html><html><body><video id = "local-video" autoplay playsinline></video><button id = "showVideoAudioBtn"> 打開攝像頭和麥克風</button><p>通過getUserMedia獲取攝像頭和麥克風</p></body><script>const constraints = {video: true,audio: true}function handleSuccess(stream){const video = document.querySelector("#local-video");video.srcObject = stream;}function handleError(error){console.error("getUserMedia error" + error);}function onOpenVideo_Audio (e){navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);}showVideoBtn = document.querySelector("#showVideoAudioBtn");showVideoBtn.addEventListener("click",onOpenVideo_Audio);</script></html>

在這里插入圖片描述

更多資料:https://github.com/0voice

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91345.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據治理平臺如何選?深度解析國產化全棧方案與行業落地實踐

“數據治理平臺廠商有哪些&#xff1f;”國內主流廠商包括阿里云、華為、百分點科技等&#xff0c;各有所長。其中&#xff0c;百分點科技憑借在應急管理、智慧公安及央國企數字化領域的深度實踐&#xff0c;打造了行業特色鮮明的數據治理解決方案。百分點科技的數據治理解決方…

限流算法詳解:固定窗口、滑動窗口、令牌桶與漏桶算法全面對比

限流&#xff08;Rate Limiting&#xff09;是保障系統穩定性和服務質量的關鍵機制&#xff0c;尤其在高并發、突發流量、攻擊防護等場景中至關重要。本文將詳細介紹四種主流限流算法&#xff1a;固定窗口&#xff08;Fixed Window&#xff09;滑動窗口&#xff08;Sliding Win…

Sentinel 搭建應用層面與網關層面的流控保護

源碼&#xff1a;妖精的尾巴/spring-cloud-alibaba Nacos 和 Sentinel Dashboard 我這里全是使用window 本地運行的&#xff0c;需要自行下載運行 服務層面&#xff1a; 當你在某個具體的服務上使用Sentinel時&#xff0c;更多的是關注該服務內部資源的保護。例如&#xff0c…

純血鴻蒙 AudioRenderer+AudioCapturer+RingBuffer 實現麥克風采集+發聲

總共兩個類&#xff0c;放到代碼里&#xff0c;就可以快速完成K歌的效果&#xff0c;但應用層這么做延遲是比較高的&#xff0c;只是做一個分享。 類代碼 import { audio } from kit.AudioKit; import { BusinessError } from kit.BasicServicesKit; import { AudioBufferFlow,…

洛谷 P1601 A+B Problem(高精)普及-

題目描述 高精度加法&#xff0c;相當于 ab problem&#xff0c;不用考慮負數。 輸入格式 分兩行輸入。a,b≤10500a,b \leq 10^{500}a,b≤10500。 輸出格式 輸出只有一行&#xff0c;代表 ababab 的值。 輸入輸出樣例 #1 輸入 #1 1 1輸出 #1 2輸入輸出樣例 #2 輸入 #2 1001 909…

Matrix Theory study notes[6]

文章目錄linear spacereferenceslinear space a basis of linear space VkV^kVk,which is x1,x2,...xkx_1,x_2,...x_kx1?,x2?,...xk?,can be called as a coordinate system.let vector v∈Vkv \in V^kv∈Vk and it can be linear expressed on this basis as va1x1a2x2...…

專線與專線之間的區別

下面我們從定義、技術特點、適用場景、優缺點等多個維度來詳細對比&#xff1a;? 一、四種方案簡要定義技術方案定義MPLS 專線運營商基于 MPLS 技術提供的私有虛擬網絡&#xff0c;邏輯隔離、安全可靠VPN over Internet利用公網加密通道&#xff08;如IPSec&#xff09;構建虛…

Git工作流:團隊協作的最佳實踐

目錄 一、什么是 Git 工作流&#xff1f;為什么需要它&#xff1f; 二、基礎&#xff1a;Git 分支核心概念 三、主流 Git 工作流實戰指南 1. 集中式工作流&#xff08;Centralized Workflow&#xff09;&#xff1a;適合小團隊 / 新手 操作步驟&#xff1a; 優缺點&#…

算法競賽階段二-數據結構(35)數據結構單鏈表模擬實現

//鏈表--鏈式存儲的線性表 //存信息和下一個節點位置&#xff0c;數據域和指針域合起來叫節點 //帶頭&#xff08;哨兵位&#xff09;下標為0 //單向&#xff0c;雙向&#xff0c;循環鏈表 //實現 單 //倆足夠大數組 // elem&#xff0c;數據域 // next &#xff0c;指針域…

《Computational principles and challenges in single-cell data integration》

1. 引言&#xff1a;單細胞數據整合的背景與重要性單細胞基因組學技術&#xff08;如scRNA-seq、scATAC-seq等&#xff09;近年來快速發展&#xff0c;能夠以單細胞分辨率揭示細胞異質性和分子機制。然而&#xff0c;不同實驗、樣本和數據模態&#xff08;如RNA表達、DNA甲基化…

蔚來汽車攜手通義靈碼入選 2025 世界人工智能大會標桿案例

7月28日&#xff0c;在2025年世界人工智能大會上&#xff0c;通義靈碼助力蔚來汽車研發效能升級成功入選2025年“人工智能”行業標桿案例薈萃。蔚來汽車已有近 1000 名工程師常態化使用通義靈碼&#xff0c;AI 生成代碼占比超 30%&#xff0c;尤其在蔚來“天探”AI自檢系統的建…

Spring Boot中的this::語法糖詳解

文章目錄前言什么是方法引用&#xff08;Method Reference&#xff09;基本語法方法引用的四種類型1. 靜態方法引用2. 實例方法引用&#xff08;特定對象&#xff09;3. 實例方法引用&#xff08;任意對象&#xff09;4. 構造器引用this::在Spring Boot中的應用場景1. Service層…

VitePress學習筆記

VitePress學習筆記VitePress學習搭建和運行編寫內容mdvue配置站點配置配置searchsearch 提示詞替換使用第三方主題自定義主題設置文檔根目錄國際化文檔navsidebarsearch其他插件vitepress插件markdown-it插件項目開發原始需求和方案自動化流程權限限制VitePress學習 搭建和運行…

C#_創建自己的MyList列表

定義一個數據自己的列表MyList 使用上述描述列表的方式(數組) 列表內也要定義屬于自己的方法 例如 Sort排序 Add添加 等等....思路┌─────────────────────────────────────────────────────────────────…

記錄Linux下ping外網失敗的問題

最近在RK3568上進行開發測試&#xff0c;需要測試一下網絡環境&#xff0c;能否通過瀏覽器訪問外部網絡。測試情況如下&#xff1a; 1、ping內網、網關ip能ping通 2、ping外網ping不通 情況分析&#xff1a; 1、ping外網失敗&#xff08;ping 8.8.8.8也ping不通&#xff0c;說…

Redis 鍵值對操作詳解:Python 實現指南

一、環境準備 1. 安裝依賴庫 pip install redis2. 連接 Redis 數據庫 import redis# 創建 Redis 客戶端連接 r redis.Redis(hostlocalhost, # Redis 服務器地址port6379, # Redis 端口db0, # 數據庫編號&#xff08;0~15&#xff09;passwordNone, …

制造業企業大文件傳輸的痛點有哪些?

在全球化與數字化的浪潮下&#xff0c;制造業企業的大文件傳輸需求日益凸顯&#xff0c;然而諸多痛點也隨之而來&#xff0c;嚴重制約著企業的高效運營與發展。復雜網絡環境導致傳輸穩定性差制造業企業常涉及跨地域、跨國的業務合作與數據交流&#xff0c;網絡環境復雜多變。在…

低速信號設計之 MDIO 篇

一、引言? 在服務器的網絡子系統中,MDIO(Management Data Input/Output)總線雖然傳輸速率相對較低,卻扮演著極為關鍵的角色。它主要負責在 MAC(Media Access Control)層器件與 PHY(Physical Layer)層器件之間搭建起通信的橋梁,實現對 PHY 層器件的有效管理與狀態監控…

AR技術賦能航空維修:精度與效率的飛躍

在航空工業領域&#xff0c;飛機維修與裝配的精度要求越來越高。傳統的維修方法依賴人工操作和經驗判斷&#xff0c;容易產生誤差。隨著增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術的引入&#xff0c;航空維修迎來了革命性的變化。本文將探討AR技術在航空維修中…

設計模式實戰:自定義SpringIOC(理論分析)

自定義SpringIOC&#xff08;理論分析&#xff09; 上一篇&#xff1a;設計模式開源實戰&#xff1a;觀察者模式不知道怎么用&#xff1f;手撕Spring源碼中跟著大佬學編程 上一篇我們研究了大佬在Spring源碼中使用的觀察者模式&#xff0c;今天我們再來聊聊Spring的核心功能—…