OBS 虚拟麦克风完全上手指南:把直播间的声音一键送进每一场会议
【免费下载链接】obs-virtual-camobs-studio plugin to simulate a directshow webcam项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam
屏幕那头的领导第三次说"你那边声音太小了",可你在 OBS 里明明加了噪音抑制、压缩器和 EQ——这套"精装修"过的声音,一进腾讯会议就全被打回原形。如果你也卡在"处理过的声音传不出去"这一步,那obs-virtual-cam就是为你准备的答案:它能把 OBS 的音频输出伪装成一个系统级的虚拟麦克风,任何认识DirectShow(Windows 的通用音视频捕获接口)的软件,都能直接接管你的声音。直播间里的效果链,从此跟着你进每一场会议。
先说痛点:你精心调过的声音,为什么出不了直播间
想象这样一个日常:你在 OBS 里搭好了完整的声音链路——降噪、压缩、EQ 一个不落,直播时观众弹幕全是"声音真干净"。可切换到 Zoom 开会,一切归零,对方听到的又是那个有杂音、忽大忽小的原始麦克风。原因很简单:会议软件不认识 OBS,它只认识系统设备列表里的东西。要么你得折腾虚拟声卡加路由跳线,要么就老老实实忍受干声。
obs-virtual-cam 的解决思路非常"物理":它让 OBS 自己变成一个设备。安装后,系统里会多出一个叫OBS-Audio的录音设备和一个叫OBS-Camera的摄像头,你在 OBS 里处理好的成品音画,会像普通麦克风、普通摄像头一样,出现在所有软件的输入列表里。
先花 3 分钟跑起来:虚拟麦克风最短上手清单
先别急着理解原理,三步就能让它工作。
第一步:装插件并注册设备。把下载好的压缩包解压到 OBS 安装目录,然后以管理员身份打开命令提示符,注册两个版本的设备(32 位和 64 位各一次):
regsvr32 "C:\Program Files\obs-studio\bin\32bit\obs-virtualsource.dll" regsvr32 "C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll"注册成功后,打开系统声音设置,录制设备列表里就会出现OBS-Audio。
第二步:把虚拟输出跑起来。打开 OBS,在"工具"里找到虚拟输出并启动;或者更精细一点,给某个画面源挂上名为VirtualCam的滤镜,只让这一路画面"变成摄像头"。
第三步:在会议软件里切换设备。打开 Zoom / Teams / 微信会议,把麦克风输入设备选成OBS-Audio。收工。
⚠️ 一个铁律:OBS 必须保持运行。因为设备只是个"取货口",真正出货的厨房在 OBS 进程里。
如果你是个喜欢折腾源码的开发者,可以用这条命令把项目克隆下来自己编译:git clone https://gitcode.com/gh_mirrors/ob/obs-virtual-cam,CMake 配置好QTDIR、DepsPath、LIBOBS_INCLUDE_DIR等变量即可。
原理拆解:一台"假设备"是怎么诞生的
会用之后,我们聊聊它背后四个精巧的设计。每个机制都遵循同一套逻辑:先打个比方,再看关键代码,最后说为什么。
第一件事:怎么让系统"看见"这台假设备
类比:DirectShow 过滤器就像是给系统名册里登记的一个官方门牌——Windows 开会盘点所有设备时,会循着门牌点名,不管门后面其实是个软件。
插件把自己注册进系统的设备分类(摄像头和音频输入各有各的分类),对外暴露两个类:CVAudio负责当"源过滤器",CVAudioStream负责真正推数据。会议软件枚举设备时,看到的就是一个正规的捕获源。这段代码在 src/virtual-source/virtual-audio.cpp 里,核心就是继承CSource和CSourceStream这两个 DirectShow 基类——只要继承得够标准,系统就认你是亲生的。
第二件事:声音靠什么从 OBS"运"到会议软件
类比:把 OBS 想象成后厨,会议软件是前台的顾客。后厨处理好的每一份"声音"摆上传送带,传菜员按顺序端走。这条传送带就是一块命名共享内存——一块两个进程都能看到的公共区域,名字叫OBSVirtualAudio。
之所以不能直接传指针,是因为 OBS 和 DirectShow 过滤器跑在不同的进程空间里,谁也够不到谁的内存。所以代码里用CreateFileMapping/MapViewOfFile划出一块环形队列,写端往里放、读端按索引取,读写互不阻塞。队列头部还记录着state(OutputStop/OutputStart/OutputReady三种状态)和write_index(写指针),读端一看状态就知道"后厨今天出不出菜"。这些定义都在 src/queue/share_queue.h。
第三件事:两头为什么要"对格式"
类比:后厨做的是标准 4 英寸盘,传菜员也只认这种盘。如果哪天后厨改用 8 英寸盘,传菜员就端不动了——所以两边必须事先约定同一个"盘子规格"。
这个规格被硬编码成了44.1kHz 采样率、16 位量化、双声道、PCM 无损。过滤器通过GetMediaType()对外自报格式:
paf->nChannels = 2; // 立体声 paf->nSamplesPerSec = SAMPLE_RATE; // 44100 paf->wBitsPerSample = 16; // 16 位深 paf->wFormatTag = WAVE_FORMAT_PCM; // PCM 编码而 OBS 这一侧,在启动虚拟输出时也主动"低头"做格式转换(见 src/virtual-output/virtual_output.cpp):
conv.format = AUDIO_FORMAT_16BIT; conv.samples_per_sec = 44100; conv.speakers = SPEAKERS_STEREO; obs_output_set_audio_conversion(out_data->output, &conv);两边同时向 44.1kHz/16bit/立体声靠拢,中间才不会有格式错位导致的无声或杂音。顺便说一句,GetStreamCaps()里把最小值和最大值也锁死成同一个值,等于告诉系统"我就这一种格式,别跟我砍价"。
第四件事:卡顿和断流时,它凭什么不爆音
DirectShow 拉流模式下,会议软件会不停调用FillBuffer()要数据,这个方法(在 src/virtual-source/virtual-audio.cpp)同时要处理三件事:
- 取不到就等:每次取不到数据,睡 5 毫秒再试,连续 20 次仍无数据才认定断流。
- 时间戳对表:维护两条时间线——OBS 侧的起始时间戳和 DirectShow 侧的起始时间戳,首帧对齐后,之后每帧按差值推算播放时刻,保证音画不跑偏。
- 静音兜底:数据不够时,不返回错误、不扯断连接,而是把缓冲区
memset清零后照常输出:
size = pms->GetActualDataLength(); memset(dst, 0, size); // 填静音,而不是摔盘子这个"宁可给一瞬静音、也绝不给刺耳爆音"的设计,正是它听感稳的核心。同时同步超时也不是拍脑袋定的,它按队列长度动态计算——队列越长,留给系统调度的余量越大。
进阶调优:延迟、路数与格式的三笔取舍账
设备跑通只是开始,下面三个参数值得你认真权衡。
延迟帧滑块(0–30 帧)——用延迟换稳定。在 OBS 的虚拟输出/滤镜设置里能找到这个滑块,默认值是 1。数值越大,队列里的"提前量"越足,系统繁忙时越不容易断音,但声音会慢半拍。做实时会议建议 1–5 帧,本地录屏可以调到 0,追求最跟嘴的实时性。
多路摄像头(最多 4 路)——按需注册。默认只有 1 路摄像头和 1 路音频。想要多路,先反注册再带参数重注册:
regsvr32 /u "...\obs-virtualsource.dll" regsvr32 /n /i:"2" "...\obs-virtualsource.dll"/i:"2"表示注册 2 路视频过滤器,最多写到 4;音频过滤器始终只有 1 路。多路摄像头适合"一个 OBS 同时给直播和录屏分别输出不同画面"的场景。
格式锁定 44.1kHz——兼容性优先的代价。这是刻意为之的设计取舍:规格越单一,兼容性越稳。代价是想用 48kHz 得改源码重新编译。对 99% 的会议场景来说,44.1kHz 完全够用,不必纠结。
另外还有两个小开关值得知道:水平翻转用于镜像你的画面(比如物理摄像头本来就需要翻转),保持宽高比用于让输出的分辨率不被对方软件强行拉伸变形。
排错速查:设备不认、声音不对,一张表对照自查
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 会议软件里选不到 OBS-Audio | 过滤器没注册或注册不完整 | 管理员权限重新 regsvr32,重启会议软件 |
| 有画面没声音 | OBS 虚拟输出没启动,队列未就绪 | 回 OBS 确认虚拟输出处于"运行中" |
| 声音断断续续、像卡带 | 系统负载高,队列缓冲不够 | 调大延迟帧数值,关掉后台音视频软件 |
| 音画对不上口型 | 时间戳基准漂移 | 重启 OBS 虚拟输出,让两条时间线重新对齐 |
| 提示采样率不支持 | 对方软件请求了非 44.1kHz 格式 | 在软件音频设置里手动强制选 44100 Hz |
排查的顺序也固定:先看 OBS 在不在跑,再看队列是不是 Ready,最后检查格式对不对——这三个节点全绿,虚拟麦克风基本不会出问题。
顺手避坑:使用虚拟麦克风的"要做"与"不要做"
✅ 要做:
- 注册时务必用管理员权限,注册完重启一次会议软件再验证。
- 开会前先启动 OBS 虚拟输出,给队列留出预热时间。
- 把 OBS 的音量、声道设置检查一遍,确保主输出有声。
- 如果你用的是 OBS 26.0 以上版本,先试试官方自带的虚拟摄像头功能——这个插件在旧版本上价值更大。
❌ 不要做:
- 别在 OBS 关闭的状态下指望虚拟麦克风工作——设备是"半截"的,读端永远等不到写端。
- 别在实时会议里把延迟拉到 30,否则对方会听到慢半拍的自己。
- 别在同一时间注册超过需要的路数,设备名册越干净越省心。
- 别忘记 44.1kHz 这条规格线,和那些硬要 48kHz 的软件打交道时先看它的音频设置。
最后一句
一个共享内存队列负责搬运,一个 DirectShow 过滤器负责"伪装",一对时间戳负责对齐,一份静音兜底负责容错——obs-virtual-cam 用这四件朴素的小工具,让"OBS 即麦克风"从想法变成了现实。真正的高手不是设备多贵,而是让处理过的声音,恰到好处地抵达它该去的每一场会议。现在就去把它装好,把今天第一场会的声音调得干净利落。
【免费下载链接】obs-virtual-camobs-studio plugin to simulate a directshow webcam项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考