系统信息

  • Debian Linux 12 (bookworm)

安装OBS-Studio及依赖

OBS-Studio在linux上有官方的flatpak支持,所以就从flathub安装

flatpak install flathub com.obsproject.Studio

flathub的配置教程在此

这里的依赖就是obs虚拟摄像头的依赖,包名为v4l2loopback-dkms
直接使用apt命令安装

sudo apt install v4l2loopback-dkms

启动OBS-Studio

首次安装完obs启动后会出现一个配置向导

如图

Screenshot_20230802_183636.png

正常情况下会出现三个选项:

  • 优先优化串流,其次为录像
  • 仅优化录像,将不会进行串流
  • 只使用虚拟摄像头

但是在我启动后只出现了前两个选项:

  • 优先优化串流,其次为录像
  • 仅优化录像,将不会进行串流

第三个选项便不出来了 经过搜索找到以下命令

sudo modprobe v4l2loopback

运行并重启obs后和图中表现一致,可以正常使用虚拟摄像头

在运行上述命令时有一行日志

v4l2loopback not installed, virtual camera disabled

思路分析

因为知道了是v4l2loopback的问题直接到github查阅源码 OBS-Studio Github

在搜索栏搜索repo:obsproject/obs-studio v4l2loopback

在code栏中有两个结果plugins/linux-v4l2/linux-v4l2.cplugins/linux-v4l2/v4l2-output.c

对应代码片段

plugins/linux-v4l2/linux-v4l2.c

bool obs_module_load(void)
{
obs_register_source(&v4l2_input);

obs_data_t *obs_settings = obs_data_create();

if (loopback_module_available()) {
obs_register_output(&virtualcam_info);
obs_data_set_bool(obs_settings, "vcamEnabled", true);
} else {
obs_data_set_bool(obs_settings, "vcamEnabled", false);
blog(LOG_WARNING,
"v4l2loopback not installed, virtual camera disabled");
}

obs_apply_private_data(obs_settings);
obs_data_release(obs_settings);

return true;
}
plugins/linux-v4l2/v4l2-output.c

static bool loopback_module_loaded()
{
bool loaded = false;

char temp[512];

FILE *fp = fopen("/proc/modules", "r");

if (!fp)
return false;

while (fgets(temp, sizeof(temp), fp)) {
if (strstr(temp, "v4l2loopback")) {
loaded = true;
break;
}
}

fclose(fp);

return loaded;
}

bool loopback_module_available()
{
if (loopback_module_loaded()) {
return true;
}

if (run_command("modinfo v4l2loopback >/dev/null 2>&1") == 0) {
return true;
}

return false;
}

先看输出日志的linux-v4l2.c文件 对应方法中通过loopback_module_available()判断v4l2loopback模块是否可用

loopback_module_available()中判断 加载模块返回true 通过modinfo命令查询到模块信息也返回true

但是在其中modinfo前未加sudo前缀,这个命令是在sbin文件夹下的,Debian默认未将sbin加入普通用户的PATH从而导致obs的判断出现错误

解决方案

修改PATH是普通用户也可直接运行sbin中程序

Debian的配置文件是/etc/profile

编辑/etc/profile并改为如下所示

if [ "$(id -u)" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
# PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
fi

问题解决