当前位置: 首页 > 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.dtcms.com/a/309499.html

相关文章:

  • Java 22 新特性解析与代码示例
  • leecode42 接雨水
  • Mysql join语句
  • ansible简单playbook剧本例子2
  • CMake set_source_files_properties使用解析
  • 如何通过黑白棋盘进行定位配准融合?(前后安装的两个相机)
  • 大模型微调实战 -基于SWIFT框架
  • 南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态
  • 使用Gemini API开发领域智能聊天机器人的思路
  • js判断是个变量和属性是否是有效值
  • PixelCNN介绍:VQ-VAE的前一步探索
  • 2025年Python Web框架之争:Django、Flask还是FastAPI,谁将主宰未来?
  • JsHook入门
  • 什么是爬虫协议?
  • 如何优雅删除Docker镜像和容器(保姆级别)
  • 热能小车cad【12张】三维图+设计说明书
  • 机械学习中的一些优化算法(以逻辑回归实现案例来讲解)
  • 【Flutter3.8x】flutter从入门到实战基础教程(五):Material Icons图标的使用
  • 燃气营商环境测评:以用户反馈推动服务升级​(第三方市场调查)
  • 逻辑回归----银行贷款模型优化
  • 嵌入式教学的云端革命:高精度仿真如何重塑倒车雷达实验与工程教育——深圳航天科技创新研究院赋能新一代虚实融合实训平台
  • IIS 让asp.net core 项目一直运行
  • Linux文件系统理解2
  • OpenGL Camera
  • 【03】海康MVS V4.3.0 ——安装教程、查看示例、库、头文件、开发指南
  • vue项目预览pdf隐藏工具栏和侧边栏
  • YOLOv8/YOLOv11 C++ OpenCV DNN推理
  • 人机协作!智慧环卫如何实现按需清扫?
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step7—Mariadb初始化
  • 链接脚本中. = ALIGN(4);的作用?