
会议软件用不上你的声音OBS 虚拟麦克风原理到落地一次讲透【免费下载链接】obs-virtual-camobs-studio plugin to simulate a directshow webcam项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam视频会议开到一半主持人一句你那边声音太小、还有杂音能换个麦吗让你当场破防——你在 OBS 里调了半天的压缩器、噪音抑制、EQ直播里听着挺干净可进了 Zoom、Teams 全部打回原形。obs-virtual-cam 这个 OBS Studio 插件就是冲着这个痛点来的它不仅能把 OBS 画面伪装成虚拟摄像头还能把 OBS 的音频输出包装成系统级的虚拟麦克风OBS-Audio让任何支持 DirectShow 的软件直接接管你处理完的声音。本文不绕弯子从设备怎么凭空出现讲到声音怎么不掉拍最后给你一套照做即通的安装配置流程。系统凭啥多出一个麦克风DirectShow 过滤器上户口的全过程先回答你最想知道的问题为什么装上这个插件系统里就多了一个叫 OBS-Audio 的录制设备而且一个驱动都没装答案藏在 DirectShow 机制里。DirectShow 是 Windows 老牌的多媒体框架Zoom、微信、Teams 这些软件找摄像头和麦克风走的就是这套接口。插件做的事就是把自己注册成一个 DirectShow 过滤器相当于去系统设备管理处上户口注册目标挂在CLSID_AudioInputDeviceCategory音频输入设备分类和CLSID_VideoInputDeviceCategory视频输入设备分类这两个系统分类目录下dllmain.cpp里的RegisterFilters()干的就是这件事音频过滤器由两个类组成CVAudio继承CSource扮演源过滤器代表设备本身CVAudioStream继承CSourceStream管理具体的数据输出引脚。源码在src/virtual-source/virtual-audio.cpp。人话翻译过滤器就是一张身份证注册进系统分类后所有按 DirectShow 规矩找设备的软件都能在列表里看到它。至于声音从哪来过滤器本身不管——它只负责被找到然后去另一个地方搬数据这就是下一节的故事。一块共享内存把两个进程接上线OBSVirtualAudio 队列的搬运日常OBS 进程和 DirectShow 过滤器各自跑在不同的进程上下文里直接传指针是行不通的你总不能把 OBS 的内存地址告诉 Zoom 让它来读。于是插件在src/queue/share_queue.h里用CreateFileMapping/MapViewOfFile建了一块命名共享内存音频通道叫OBSVirtualAudio。一条完整的数据链路长这样OBS音频输出 → 共享内存环形队列(OBSVirtualAudio) → CVAudioStream取帧 → DirectShow媒体样本 → 会议软件队列头部queue_header里存着几个关键字段state队列状态、write_index写指针、delay_frame延迟帧数。写端往队列里推帧、读端按索引取帧互不阻塞。状态机只有三档状态含义OutputStop队列已关闭OBS 输出没在跑OutputStart正在启动数据还没就绪OutputReady数据就绪可以正常取帧这里有个容易被忽略但很关键的设计延迟缓冲。读端初始化索引时不是从写指针当前位置开始而是回退到写指针减去延迟帧的位置见share_queue_init_index()相当于给数据流预留了一段缓冲期。系统调度一抖、进程切换一慢缓冲能兜住声音就不会断成卡带。44.1kHz/16bit/立体声虚拟麦克风出厂即锁死的格式底气当会议软件来问你能给什么格式时插件通过GetMediaType()自报家门src/virtual-source/virtual-audio.h里的常量定死了规格#define AUDIO_BUFFER_SIZE 4096 // 单个媒体样本的缓冲区字节数 #define SAMPLE_RATE 44100 // 采样率 #define SAMPLE_SIZE 176400 // 每秒字节数 44100 × 2声道 × 2字节对应的WAVEFORMATEX结构填写如下paf-nChannels 2; // 双声道 paf-nSamplesPerSec SAMPLE_RATE; // 44.1kHz paf-nAvgBytesPerSec SAMPLE_SIZE; // 176400 字节/秒 paf-nBlockAlign 4; // 每帧字节数 声道数 × 位深/8 paf-wBitsPerSample 16; // 16 位深度 paf-wFormatTag WAVE_FORMAT_PCM; // 标准 PCM更绝的是GetStreamCaps()里声明的能力范围——MinimumSampleFrequency和MaximumSampleFrequency都是 44100声道数最小最大都是 2位深同理。人话翻译最小值和最大值锁在同一个值上等于跟系统说我就支持这一种格式别跟我讨价还价。好处是兼容性极稳任何按规矩协商的软件都能谈拢坏处是想用 48kHz 得改源码重新编译没有第二种选择。与此同时OBS 这一侧也得配合演出。在src/virtual-output/virtual_output.cpp的virtual_output_start()里插件主动声明了输出格式转换conv.format AUDIO_FORMAT_16BIT; conv.samples_per_sec 44100; conv.speakers SPEAKERS_STEREO; obs_output_set_audio_conversion(out_data-output, conv);也就是说OBS 内部不管你用什么采样率跑喂给虚拟麦克风之前都会被统一转成 44.1kHz/16bit/立体声。两头对表格式才对得上这就是格式一致这一件事的两半。FillBuffer 三件套取数据、对时间戳、静音兜底DirectShow 拉流模式下系统会不停调用CVAudioStream::FillBuffer()索要数据这个方法是音频模块的心脏一帧要处理三件事第一从队列取数据。每次通过shared_queue_get_audio()取出最多AUDIO_BUFFER_SIZE字节。取不到就Sleep(5)睡 5 毫秒再试连续超过 20 次仍无数据就视为断流。20 这个数不是乱拍的它约等于 100 毫秒——比一次正常的系统调度抖动长得多。第二时间戳对表。代码里维护了两条时间线obs_start_tsOBS 侧起始时间戳和dshow_start_tsDirectShow 侧起始时间戳。首帧到达时对齐之后每帧的播放时刻按dshow_start_ts (timestamp - obs_start_ts) / 100推算确保第三方软件看到的音频时间轴和 OBS 里的画面进度保持一致不会越说越错位。第三静音兜底。数据不够或断流时绝不返回错误或把设备消失而是把缓冲区memset成零再照常输出——你听到的是一瞬静音而不是刺耳的爆音或突然没声。只有队列状态明确为OutputStop时才真正断开。宁可给静音也不给噪音这种容错设计正是它听感稳定的关键。同步超时同样是算出来的SetTimeout()里有一行sync_timeout queue.header-queue_length * AUDIO_SIZE * 10000000 / 44100 * 4;人话翻译队列越长、超时越宽松等于给系统调度留更多余量代价是延迟变高。这条公式就是你后面在设置面板里看到的缓冲帧滑块的物理来源——数值越大越稳、但越延迟。五步完成安装配置管理员权限、32/64 位、缓冲滑块一个都别省下面这套流程照做即通每步都告诉你为什么。第 1 步解压到 OBS 安装目录。把发布页的压缩包解压后放进你的 obs-studio 安装文件夹确保目录结构和 OBS 现有的bin\32bit、bin\64bit对上。别图省事只放一半32 位和 64 位的 dll 是两个文件缺一不可。第 2 步以管理员身份打开 CMD 注册过滤器。这是最容易被卡住的一步——不以管理员运行regsvr32 会报权限错误regsvr32 C:\Program Files\obs-studio\bin\32bit\obs-virtualsource.dll regsvr32 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll第 3 步验证注册结果。打开控制面板 → 声音 → 录制如果出现名为OBS-Audio的设备说明注册成功。看不到八成是第 2 步没提权重来一次。第 4 步在 OBS 里启动虚拟输出。打开 OBS在工具菜单里找到虚拟摄像头面板点启动。注意观察状态OBS 必须保持运行因为共享内存的另一端在 OBS 进程里关掉 OBS会议软件里的 OBS-Audio 就会变成哑巴设备。第 5 步进目标软件选设备。打开 Zoom / Teams / 微信会议把麦克风输入切到OBS-Audio。想开多路虚拟摄像头最多 4 路的话先反注册再带参数重注册regsvr32 /u C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll regsvr32 /n /i:2 C:\Program Files\obs-studio\bin\64bit\obs-virtualsource.dll/i:2表示注册 2 路视频过滤器音频过滤器始终固定 1 路。改完记得重启会议软件让它重新扫描设备列表。关于缓冲帧滑块界面里叫缓冲帧默认值是 3 帧范围 0–30。数值越大音频越稳但延迟越高——视频会议建议 1–5 帧本地录屏可以拉到 0。改完记得重启一次虚拟输出配置才真正生效。常见翻车现场对症下药无声、爆音、选不到设备一次解决现象可能原因处理方式会议软件里选不到 OBS-Audio过滤器没注册或注册不完整用管理员权限重跑 regsvr32重启会议软件有画面没声音OBS 虚拟输出没启动或队列未就绪回 OBS 确认虚拟摄像头面板处于运行中声音断断续续像卡带系统负载高队列缓冲不足调大缓冲帧数值关掉后台音视频软件说话对不上口型时间戳基准漂移重启 OBS 虚拟输出让两端时间线重新对齐软件提示采样率不支持第三方请求了非 44.1kHz 格式在软件音频设置里强制选 44100Hz一句话排查思路先确认 OBS 在跑再确认队列是 Ready 状态最后检查格式是不是 44.1kHz/16bit/立体声——这三个节点全对虚拟麦克风基本不会出问题。obs-virtual-cam 的音频模块用一套极简的组合拳——共享内存队列做搬运、DirectShow 过滤器做伪装、时间戳对表做同步、静音兜底做容错——把OBS 即麦克风做成了随手可用的现实。下次再遇到无声、卡顿、对不上口型你就不再是瞎猜而是能顺着这条数据链路一步定位到病灶。动手装好它把你精心调过的那路声音交给每一场重要的会议吧——真正的专业不是设备多贵而是让声音恰到好处地抵达该去的地方。【免费下载链接】obs-virtual-camobs-studio plugin to simulate a directshow webcam项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考