前言
来啦老铁!
好久不见,甚是想念~
最近公司大神在某些测试场景中提到“虚拟摄像头”的概念,虽然只是工具,但我觉得还是蛮新颖的,值得学习记录一下,他就是:
-
OBS 中的虚拟摄像头;
-
python 体系下调用 OBS 的虚拟摄像头:pyvirtualcam;
毕竟没玩过,咱们一起来学习下吧~
简单认识 OBS
OBS 是一款广泛应用的视频直播录制软件。OBS 软件包含了一个虚拟摄像头功能。
简单认识 pyvirtualcam
pyvirtualcam 是 Python 体系下的一个发送帧到虚拟摄像头的第三方包,Python 中央仓库中的介绍:
整体步骤
- 安装 macOS: OBS;
- 使用 OBS 虚拟摄像头;
- 新建 python 项目并安装 pyvirtualcam 模块;
- 使用官方案例进行简单 demo;
- 演示发送图片、视频;
1. 安装 macOS: OBS
-
安装地址;
https://obsproject.com/ -
下载安装包并安装;
选择操作系统,点击后自动下载安装包,然后点击安装包安装即可。 -
安装完成后打开 OBS 软件,软件样子如下:
如果是 windows 机器,则可能需要涉及到安装虚拟摄像头插件,笔者没有 windows 机器,请笔者自行百度~
2. 使用 OBS 虚拟摄像头;
- 点击 OBS 软件中的 “+” 号,添加素材,例如我们选择视频,即:Media Source;
使用了我女儿的一个视频,这爹也是没谁了😂
(我使用我们公司的产品进行视频通话,并选择在视频时选择虚拟摄像头,如下图:)
选择虚拟摄像头
以上为手工操作 OBS 使用虚拟摄像头的过程,下面我们来探索用代码来使用虚拟摄像头。
3. 新建 python 项目并安装 pyvirtualcam 模块;
- 简单新建 python 项目,如:
- 安装 pyvirtualcam 模块:
pip3 install pyvirtualcam
4. 使用官方案例进行简单 demo;
- 项目中创建一个 python 文件,如:main.py
- 参考 pip 中央仓库上的例子 在 main.py 写入代码,如:
import pyvirtualcam
import numpy as np
def test():
with pyvirtualcam.Camera(width=1280, height=720, fps=20) as cam:
print(f'Using virtual camera: {cam.device}')
frame = np.zeros((cam.height, cam.width, 3), np.uint8) # RGB
while True:
frame[:] = cam.frames_sent % 255 # grayscale animation
cam.send(frame)
cam.sleep_until_next_frame()
if __name__ == '__main__':
test()
简单解读一下代码:
代码中创建了一个虚拟摄像头,模拟采集 1280*720,帧率为 20 的视频,模拟摄像头采集到了的内容为模拟的渐变灰度动画(RGB类型的图片组成的动画)
- 定制颜色
a. 如果要改为渐变的其他颜色动画,则可以将 frame[:] = cam.frames_sent % 255 改为:
红色渐变动画:frame[:, :, 0] = cam.frames_sent % 255
绿色渐变动画:frame[:, :, 1] = cam.frames_sent % 255
蓝色渐变动画:frame[:, :, 2] = cam.frames_sent % 255
b. 如果要改为固定颜色动画,则可以将 frame[:] = cam.frames_sent % 255 改为:
固定红色:frame[:, :, 0] = 120,120 为颜色成分值,取值范围为 0 ~ 255;
c. 如果要改为任意颜色,如黄色,则可以将 frame[:] = cam.frames_sent % 255 改为:
固定黄色:
frame[:, :, 0] = 255
frame[:, :, 1] = 255
frame[:, :, 2] = 0
以上数值 255,255,0 这三个值则需要查看 RGB 颜色对照表,RGB 颜色对照表可参考:
https://tool.oschina.net/commons?type=3
明白了这个原理,我们也可以做出任意颜色组成的动画,此处不多做介绍,笔者有兴趣可以自行探索~
- 执行 main.py;
必须先确保 OBS 软件已关闭虚拟摄像头,否则运行报错。
python3 main.py
执行 main.py
-
查看虚拟摄像头的效果;
(我使用我们公司的产品进行视频通话,在视频通话的时候,要选择虚拟摄像头,如下图的 OBS Virtual Camera)
我们可以很清楚的看到看到,视频通话的发起者和对方,画面都是由渐变色的帧组成的,不再是使用真实硬件采集的画面,demo 成功~
5. 演示发送图片、视频;
视频是由一帧一帧的图片组成的,因此我们只需要掌握了图片的发送方式,视频自然不再话下,时间有限,因此笔者仅探索演示发送图片的过程;
- 首先安装 opencv-python;
pip3 install opencv-python
- 添加任意图片到项目,如 doggie.png:
- 修改 main.py 中的代码为:
import pyvirtualcam
import cv2
def test():
image_file = 'doggie.png'
image = cv2.imread(image_file)
# 转换为RGB:由于 cv2 读出来的图片默认是 BGR,因此需要转换成 RGB
image = image[:, :, [2, 1, 0]]
with pyvirtualcam.Camera(width=794, height=978, fps=20) as cam:
print(f'Using virtual camera: {cam.device}')
while True:
cam.send(image)
cam.sleep_until_next_frame()
if __name__ == '__main__':
test()
- 重新执行 main.py 文件;
基于上述的功能,我们可以包装出一些有意思的“玩具”,读者朋友可自行脑补~
好了,今天的 OBS + pyvirtualcam 的学习就要告一段落了,OBS 还有其他功能,我们有机会再一起学习~
如果本文对您有帮助,麻烦动动手指点点赞?
非常感谢!
网友评论