React + ts + react-webcam + CamSplitter 實現虛擬攝像頭解決win攝像頭獨占的問題

一、安裝?CamSplitter?

這塊網上有很多教程了,這里不再贅述,就一點,需要分幾個虛擬攝像頭,就要在CamSplitter 的安裝目錄下?driver_install.cmd 執行幾次。

二、React + ts + react-webcam 調用虛擬攝像頭

import { useState, useEffect, useCallback, useMemo } from "react";
import Webcam from "react-webcam";interface DeviceInfo {deviceId: string;label: string;kind: string;
}export const VirtualCameraViewer = () => {const [_, setDevices] = useState<DeviceInfo[]>([]);const [selectedDevice, setSelectedDevice] = useState<string | null>(null);//這里實現了跨系統的適配const systemSpecificConstraints = useMemo(() => {const isLinux = navigator.userAgent.includes("Linux");const isWindows = navigator.userAgent.includes("Windows");if (isLinux) {return {width: { ideal: 640 },height: { ideal: 480 },frameRate: { ideal: 15 },facingMode: "environment",};} else if (isWindows) {return {width: { ideal: 640 },height: { ideal: 480 },frameRate: { ideal: 30 },facingMode: "user",};}return {};}, [navigator.userAgent]);// 必須先請求攝像頭權限才能獲取完整設備信息async function initCamera() {try {//瀏覽器webRTC 請求攝像頭權限const stream = await navigator.mediaDevices.getUserMedia({ video: true });stream.getTracks().forEach((track) => track.stop()); // 釋放初始流//獲取攝像頭列表const devices = await navigator.mediaDevices.enumerateDevices();//過濾出來虛擬攝像頭 這里 linux系統可以使用 v4l2loopback實現//v4l2loopback label 包含 Virtual。//CamSplitter的虛擬攝像頭默認名稱為CamSplitter #1,CamSplitter #2const cameras = devices.filter((d) =>d.kind === "videoinput" &&(d.label.includes("Virtual") || d.label.includes("CamSplitter")));console.log("攝像頭列表:", cameras); // 檢查label和deviceIdhandleDevices(cameras);} catch (error) {console.error("權限獲取失敗:", error);}}const handleDevices = useCallback((mediaDevices: MediaDeviceInfo[]) => {setDevices(mediaDevices);if (mediaDevices.length > 0) {setSelectedDevice(mediaDevices[0].deviceId);}}, []);useEffect(() => {initCamera();}, [handleDevices]);return (<>{selectedDevice && (<Webcamaudio={false}videoConstraints={selectedDevice? {...systemSpecificConstraints,deviceId: { exact: selectedDevice },}: { ...systemSpecificConstraints }}/>)}</>);
};

上面就實現了一個簡單 的 瀏覽器通過webRTC 調用虛擬攝像頭,避免攝像頭被占用的問題。

注意:1、webRTC只有現代瀏覽器支持,成熟方案應該考慮老舊版本瀏覽器不支持webRTC的問題。

? ? ? ? ? 2、考慮攝像頭流資源釋放問題。

? ? ? ? ? 3、瀏覽器調用攝像頭,第一次要獲取權限。

? ? ? ? ? 4、CamSplitter 要讀取真實的攝像頭流并最小化。

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

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

相關文章

【深度學習①】 | Numpy數組篇

0 序言 本文為NumPy數組庫的系統學習筆記&#xff0c;將自己先前的筆記做一個總結歸納。內容涵蓋數組基礎、創建、索引、變形、運算、函數、布爾型數組及與張量的銜接等內容。通過具體示例解析核心概念與操作&#xff0c;幫助讀者掌握NumPy的使用邏輯與方法&#xff0c;為后續深…

5.實現 call

call 是 JavaScript 中非常核心的函數方法之一。它能改變函數的執行上下文&#xff08;也就是 this 的指向&#xff09;&#xff0c;在日常開發和面試中都極其常見。本文將帶你一步步實現一個 Function.prototype.call 的自定義版本&#xff0c;真正理解它的底層原理。? 一、c…

Go語言中的盲點:競態檢測和互斥鎖的錯覺

&#x1f9e0; Go語言中的盲點&#xff1a;競態檢測和互斥鎖的錯覺 使用 -race 就能發現所有并發問題&#xff1f;加了 mutex 就萬無一失&#xff1f; 這篇文章揭示了 Go 并發編程中的一個“危險盲區” —— 互斥鎖并不能總能保護你免受數據競爭的影響&#xff0c;尤其是在 -ra…

從文件到文件描述符:理解程序與文件的交互本質

一、理解文件 拋一個概念&#xff1a; 文件 內容 屬性。 1. 那么&#xff0c;空文件有大小嗎&#xff1f;答案是有的。因為空文件指的是文件內容為空&#xff0c;文件屬性也要占據大小啊。 將來對文件操作&#xff0c;無非分為兩類&#xff1a; 1.對文件內容做修改。 2.對文件…

優化算法專欄——閱讀導引

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

[ The Missing Semester of Your CS Education ] 學習筆記 Vim篇

“Writing English words and writing code are very different activities. When programming, you spend more time switching files, reading, navigating, and editing code compared to writing a long stream.” —— < The Missing Semester of Your CS Education &g…

Linux 系統中定時執行指定命令 crontab 定時任務配置

crontab 定時任務配置是 Linux/Unix 系統中用于自動、周期性執行指定命令或腳本的工具&#xff0c;相當于系統的 “定時鬧鐘”。它可以讓系統在預設的時間&#xff08;如每天凌晨、每周一、每月 1 號等&#xff09;自動完成重復性工作&#xff0c;無需人工干預。自動化運維定期…

[ Leetcode ]---快樂數

題目鏈接 Leetcode快樂數 題目描述 如下圖&#xff1a; 題目解析&#xff1a; 1.雙指針法 算法核心思路 判斷快樂數的關鍵挑戰是如何檢測是否進入無限循環。這里使用了快慢指針法&#xff08;Floyd 循環檢測算法&#xff09;&#xff0c;這是一種高效檢測循環的技巧&#…

智慧社區構建——2

1.實現Token校驗## Token校驗URLjson GET /checkToken 參數json HttpServletRequest request 返回json {"msg": "操作成功","code": 200,"status": "ok" }{"msg": "操作成功","code": 200,&q…

K-Means聚類:當數據沒有標簽時,如何讓計算機自動“物以類聚”?

K-Means聚類&#xff1a;當數據沒有標簽時&#xff0c;如何讓計算機自動“物以類聚”&#xff1f;&#x1f44b; 大家好&#xff0c;我是小瑞瑞&#xff01;歡迎回到我的專欄&#xff01; 在我們之前的旅程中&#xff0c;解決的問題大多都有一個明確的“目標”&#xff0c;比如…

萬事皆可用 GeeLark AI

在今年4月&#xff0c;GeeLark AI 全面接入 DeepSeek AI 大模型&#xff0c;你可以在獨立窗口中便捷地使用 GeeLark AI。除了幫助你編寫文案等基礎內容&#xff0c;在使用 GeeLark 過程中&#xff0c;如果遇到問題&#xff0c;也可以通過詢問 GeeLark AI&#xff0c;及時獲取幫…

3D 高保真處理:聲網讓游戲聲音隨角色動作變化

傳統游戲的聲音體驗像老式收音機&#xff0c;不管聲源位置、距離和障礙物&#xff0c;僅靠左右聲道機械調音量&#xff0c;毫無方向感和空間感&#xff0c;如同蒙眼聽聲辨位。射擊游戲中敵人從左邊來&#xff0c;耳機卻兩邊同響且音量相近&#xff0c;讓人暈頭轉向&#xff1b;…

Nestjs框架: 請求生命周期與應用生命周期

概述 在 NestJS 框架中&#xff0c;中間件&#xff08;Middleware&#xff09;、管道&#xff08;Pipes&#xff09;、過濾器&#xff08;Filters&#xff09;、攔截器&#xff08;Interceptors&#xff09; 均屬于請求處理流程的核心組件&#xff0c;它們共同構成了 NestJS 的…

Nastool+cpolar:群暉NAS用戶的全場景影音自由方案

文章目錄前言1. 本地搭建Nastool2. nastool基礎設置3. 群暉NAS安裝內網穿透工具4. 配置公網地址小結5. 配置固定公網地址**第二版&#xff1a;技術整合與效率提升導向****第二版&#xff1a;技術整合與效率提升導向****第二版&#xff1a;技術整合與效率提升導向**Nastool與cpo…

從零開始:Kaggle 競賽實戰入門指南

一、Kaggle社區概述 Kaggle 是全球最大的數據科學和機器學習社區&#xff0c;由Anthony Goldbloom于2010年創立&#xff0c;2017年被Google收購。平臺專注于數據科學競賽、開源數據集共享、協作編程以及技能學習&#xff0c;吸引了從初學者到專業數據科學家的廣泛用戶群體。 …

sqli-labs:Less-16關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;…

Lipschitz連續函數

Lipschitz function 一、說明 在數學分析中&#xff0c;Lipschitz連續性以德國 數學家 魯道夫利普希茨 (Rudolf Lipschitz)的名字命名&#xff0c;是函數一致連續性的強形式。直觀地說&#xff0c;Lipschitz連續函數的變化速度有限&#xff1a;存在一個實數&#xff0c;使得對于…

Dynamics 365 business central 與Shopify集成

Dynamics 365 Business Central&#xff08;簡稱 D365 BC&#xff09; 與 Shopify 的集成&#xff0c;能幫助企業實現前端電商平臺&#xff08;Shopify&#xff09;與后端 ERP 系統&#xff08;Business Central&#xff09;之間的無縫數據同步&#xff0c;是一種典型的 ERP 與…

TCP RTO 與丟包檢測

TCP RTO 是它 40 多年前唯一丟包檢測策略&#xff0c;也是當前最后的丟包檢測兜底策略&#xff0c;它幾乎從沒變過。 有個咨詢挺有趣&#xff0c;以其案例為背景寫篇隨筆。大致意思是&#xff0c;嫌 TCP RTO 太大&#xff0c;游戲場景丟包卡頓怎么辦&#xff1f;我提供了幾行代…

安裝php和配置環境變量

為了簡單方便&#xff0c;先下載vscode然后下載對應的php安裝包&#xff0c;然后配置環境變量&#xff0c;然后點擊運行即可下載對應版本的php&#xff0c;這個版本湊合用然后下載完之后解壓配置環境變量搜索環境變量將路徑添加到環境變量中然后打開vscode添加變量具體看實際路…