同一Linux机器不同浏览器测试WebRTC视频通话时NotReadableError问题咨询
同一Linux机器不同浏览器测试WebRTC视频通话时NotReadableError问题咨询
嗨,我之前在Linux环境下做WebRTC测试时也碰到过几乎一模一样的问题,结合你描述的场景——同一台机器上用Chrome和Chromium两个独立浏览器测试,排除权限问题后,这个NotReadableError基本可以确定是Linux系统的视频设备独占机制导致的:物理摄像头在Linux里默认是单进程独占的,当其中一个浏览器已经成功获取并占用摄像头设备后,另一个浏览器进程就无法再启动这个视频源了。
给你几个实用的解决办法:
用虚拟摄像头实现多进程共享物理设备
这是最靠谱的长期测试方案,借助Linux的v4l2loopback工具创建虚拟摄像头,把物理摄像头的画面同步推送到多个虚拟设备,让每个浏览器各自占用一个虚拟设备即可:- 先安装工具包(以Debian/Ubuntu为例,其他发行版用对应包管理器):
sudo apt install v4l2loopback-dkms v4l2loopback-utils - 加载内核模块并创建两个虚拟摄像头设备:
sudo modprobe v4l2loopback devices=2 - 用ffmpeg把物理摄像头的画面推送到两个虚拟设备:
(注意:这里假设你的物理摄像头是ffmpeg -f v4l2 -i /dev/video0 -f v4l2 /dev/video1 -f v4l2 /dev/video2/dev/video0,可以用v4l2-ctl --list-devices命令查看设备路径)
完成后分别在Chrome和Chromium的媒体设备选择里,各自选一个虚拟摄像头就能同时使用了。
- 先安装工具包(以Debian/Ubuntu为例,其他发行版用对应包管理器):
临时禁用摄像头,先验证通话逻辑
如果只是想先排查WebRTC的连接、音频等逻辑是否正常,不想折腾虚拟摄像头,可以临时修改获取媒体流的代码,把视频采集关掉:// 临时修改媒体约束,仅启用音频 navigator.mediaDevices.getUserMedia({ audio: true, video: false }) .then(stream => { // 后续流处理逻辑 })这样两个浏览器都不会占用摄像头,先确认通话链路没问题后,再回头处理视频的共享问题。
尝试浏览器的隔离模式(临时排查用)
可以试试打开其中一个浏览器的隐私/隐身窗口,比如Chrome隐身窗口+Chromium正常窗口,这类模式会使用独立的进程空间,有可能绕开进程间的设备占用冲突。不过这个方法稳定性不高,只适合快速排查问题,不适合长期测试。重启媒体服务,清理残留占用
有时候Linux的PipeWire或PulseAudio服务可能会残留设备占用的进程,重启相关服务试试:systemctl --user restart pipewire pipewire-pulse重启后再重新测试,有可能解决偶然的进程残留导致的设备占用问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

