当前位置: 首页 > news >正文

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.lryc.cn/news/607103.html

相关文章:

  • LangChain框架入门03:PromptTemplate 提示词模板
  • evo_traj的参数设置及保存图片
  • React 19 革命性升级:编译器自动优化,告别手动性能调优时代
  • RAGFLOW~Enable RAPTOR
  • 机器学习sklearn:随机森林的决策树
  • OPENGLPG第九版学习 - 纹理与帧缓存 part2
  • 数据结构学习基础和从包装类缓存到泛型擦除的避坑指南
  • C++入门基础 2
  • C语言使用GmSSL库实现sm3、sm4算法
  • Linux----信号
  • Docker学习其二(容器卷,Docker网络,Compose)
  • cocosCreator2.4 googlePlay登录升级、API 35、16KB内存页面的支持
  • 特征工程 --- 特征提取
  • (一)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • 【C++】类和对象 上
  • 逻辑回归算法中的一些问题
  • Leetcode——53. 最大子数组和
  • elementui中rules的validator 用法
  • 在线教程丨全球首个 MoE 视频生成模型!阿里 Wan2.2 开源,消费级显卡也能跑出电影级 AI 视频
  • Windows11 WSL安装Ubntu22.04,交叉编译C语言应用程序
  • 网站建设服务器从入门到上手
  • 《n8n基础教学》第一节:如何使用编辑器UI界面
  • 如何优雅删除Docker镜像和容器(保姆级别)
  • 服务器地域选择指南:深度分析北京/上海/广州节点对网站速度的影响
  • FreeSWITCH与Java交互实战:从EslEvent解析到Spring Boot生态整合的全指南
  • 分布式弹幕系统设计
  • Git 误删分支怎么恢复
  • ABP VNext + Dapr Workflows:轻量级分布式工作流
  • stl的MATLAB读取与显示
  • Blender 4.5 安装指南:快速配置中文版,适用于Win/mac/Linux系统