Linux上OBS虚拟摄像头
前言
费尽周折,终于根据网上资料,自行探索出一种在Linux上使用OBS虚拟摄像头的方案。通过设置OBS虚拟摄像头,可以使用OBS导播软件设置钉钉视频会议的画面,大大提高了视频会议的自由度。根据网上的一些指引,目前流行的使用OBS虚拟摄像头方法有:
- 使用
v4l2loopback
和obs-v4l2sink
来“方便”地使用虚拟摄像头,但经笔者测试,上述方案在笔者这里不可行 - 使用26.1或以上版本的OBS软件,据称内置虚拟摄像头功能,但笔者的UOS家庭版安装的只有26.0版本,且网上找不到编译好的26.1以上版本OBS安装包,本地编译出错太多
- 使用Mac OS或Windows系统
基本信息
本方案经过笔者在以下基础上实践验证通过
操作系统 | UOS家庭版20(基于Deepin>Debian>Linux) |
---|---|
系统架构 | amd64 |
将要做什么
这里简述本文所述的方案思路,请读者自行判断是否适用,自行决定是否使用:通过搭建本地rtmp流服务器,用OBS向本地流服务器推流,通过ffmpeg拉流写入通过v4l2loopback生成的虚拟摄像头中,再通过钉钉读取该虚拟摄像头。如有更方便快捷的方案欢迎反馈!
操作步骤
安装OBS
不同系统安装方法不同,详细请参考OBS官网的安装教程,以下为UOS/Deepin上的安装方法
要求UOS/Deepin版本为20或以上
- 首先,更新apt
sudo apt-get update
- 需要安装
FFmpeg
,如果你尚未安装,你可以通过以下命令进行安装或自行编译
sudo apt-get install ffmpeg
- 验证FFmpeg是否安装成功
命令行输入
ffmpeg
如果显示类似下面这样的结果则为安装成功
ffmpeg version 4.1.6-1+dde Copyright (c) 2000-2020 the FFmpeg developers
…………
- 现在,你可以安装OBS软件了
sudo apt-get install obs-studio
安装nginx流服务器
本文编写的背景是没有安装过nginx服务,因此从头编译。
本部分参考这篇文章
安装含有rtmp模块的nginx服务器
-
访问http://nginx.org/官网下载稳定版nginx包,以笔者为例:打开链接后点击蓝色的
nginx-1.21.3
链接,在新页面中点击stable下的nginx-1.20.1
链接(如图所示),下载后缀名为.tar.gz
的文件,建议新建一个文件夹专门放置这些文件以便后面操作,后文中称该目录为“项目目录”
-
在项目目录中打开终端,输入以下命令解压nginx服务器文件(具体文件名请以实际为准,自行调整)
tar -zxvf nginx-1.20.1.tar.gz
- 在项目目录中,下载
nginx-rtmp-module
模块,执行(前提是已安装Git
)
git clone https://github.com/arut/nginx-rtmp-module.git
如果Git无法访问请自行百度寻找解决方法,也可以尝试通过浏览器访问https://github.com/arut/nginx-rtmp-module自行手动下载
- 执行以下命令进入nginx解压目录
cd nginx-1.20.1
- 在nginx解压目录中执行以下命令配置编译参数,生成makefile
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module
- 在nginx解压目录中执行以下命令进行编译和安装,注意该操作可能需要
sudo
权限,有一定风险
make && make install
如果提示权限不足,请先执行清除命令(如下)
make clean
然后再使用sudo执行编译和安装命令
sudo make && sudo make install
如果已安装nginx请参考这篇文章添加rtmp模块
配置nginx直播功能
- 可通过以下命令查找nginx配置文件的位置
whereis nginx.conf
例如笔者的是在/usr/local/nginx
下,执行以下命令进入该nginx安装目录下的conf文件夹
cd /usr/local/nginx/conf
- 使用管理员权限打开编辑
usr/local/nginx/conf
目录下的nginx.conf
配置文件,笔者个人更喜欢图形界面编辑器(示例中使用Visual Studio Code),你也可以使用vim等命令行编辑器 - 打开配置文件后,在http节点内添加以下内容
#RTMP server
server {
listen 8080;
#配置RTMP状态一览HTTP页面=========================================
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /opt/rtmp/nginx-rtmp-module/;
}
#配置RTMP状态一览界面结束==========================
#HTTP协议访问直播流文件配置
location /hls { #添加视频流存放地址。
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
#访问权限开启,否则访问这个地址会报403
autoindex on;
alias /usr/share/nginx/html/hls;#视频流存放地址,与下面的hls_path相对应,这里root和alias的区别可自行百度
expires -1;
add_header Cache-Control no-cache;
#防止跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
}
留意大括号的位置,大致位置示意如下:
http{
#RTMP server
server{
xxx: xxx
}
}
- 随后在http的大括号外添加以下内容
rtmp {
server {
listen 1935;
chunk_size 4000;
application vod {
play /usr/share/nginx/html/vod/flvs/;#点播媒体存放目录
}
application live {
live on;
}
#HLS直播配置
application hls {
live on;
hls on;
hls_path /usr/share/nginx/html/hls;#视频流存放地址
hls_fragment 5s;
hls_playlist_length 15s;
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
留意大括号位置,大致示意如下
http{
xxx
}
rtmp{
xxx
}
- 修改完成后保存文件
- 命令行执行以下命令开启nginx服务,nginx的路径以实际为准,该操作可能需要
sudo
权限,请自行评估风险
/usr/local/nginx/sbin/nginx
- 浏览器访问本地服务器
http://本地IP地址
,看到如下所示则为nginx运行成功
安装v4l2loopback
直接访问https://packages.debian.org/sid/all/v4l2loopback-dkms/download可下载amd64版本的deb安装包,下载完成后双击安装即可。其它系统请访问其GitHub项目地址获取详细安装指南
OBS推流
- 测试OBS推流功能是否正常,鉴于自己搭建的rtmp流服务器可能存在缺陷,为测试OBS推流功能,笔者使用Bilibili的直播功能进行测试,此处不再赘述
- 测试确认OBS推流功能正常后,打开OBS设置,点击
流
选项卡,选择自定义推流地址,在推流地址中填写rtmp://本地IP地址/live
,流名称填写为你自定义的“直播间名称”,然后点击“应用”,点击“确定”,如图所示:
- 点击OBS主界面右下角的
开始推流
按钮,此时应该推流成功,以笔者所用版本为例,推流成功后右下角显示绿色的标识,界面最下方显示有推流的速度等系统信息
拉RTMP流
VLC测试拉流
可以通过VLC,点击左上角“媒体”,点击“从剪贴板打开位置”,输入流地址rtmp://本地IP地址/live/test
,test为你自定义的流名称
可以在OBS中添加图片等素材测试播放是否成功,若播放成功可进行下一步,VLC测试播放效果如图
注意:为防止不可预料的啸叫等情况发生,建议开启电脑静音后再进行播放
FFPlay测试拉流
如果没有安装VLC也可以使用FFPlay播放流地址,执行如下命令,注意替换你的IP地址以及流名称
ffplay rtmp://本地IP地址/live/test
ffplay测试播放效果如下
开启虚拟摄像头
- 执行以下命令开启虚拟摄像头
sudo modprobe v4l2loopback
- 将rtmp流写入虚拟摄像头,执行以下命令,注意该命令末尾的/dev/video2为虚拟摄像头的路径,请以实际为准,可能是video1、video0之类的,请自行更改本地IP地址和虚拟摄像头路径
ffmpeg -i rtmp://本地IP地址/live/test -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video2
- 此时应当大功告成了!剩下步骤的基本不会出错
应用程序中调用
打开钉钉、飞书、腾讯会议等软件(这里以钉钉内测版为例),进入视频会议,选择相应的虚拟摄像头,如图所示,即可使用
结语
本篇为作者原创,转载请注明来源,本篇首发于语雀平台,如果本文格式出错,请点击链接跳转至语雀查看https://www.yuque.com/peterzhong/uwx78e/wobz0x