兄弟们,有没有经历过这种崩溃时刻——
辛辛苦苦录了一小时网课 / 会议 / 游戏高光,回放一看:画面丝滑,声音只剩风扇呼呼转。
弹幕都在问:"老师你是在太空讲课吗?"
我自己也翻过这个车,后来扒了一圈 WASAPI 文档 + 踩了无数坑,终于搞明白了。今天把这条路走通,从原理到代码到工具,一次讲透。
🔍 先搞清楚:为什么会"没声音"?
一句话总结:
你的录屏工具抓的是麦克风(Capture),但你想录的是系统声音(Render)。
Windows 的音频体系是这样的:
text
应用播放音乐 → Render Endpoint(渲染出口)→ 音箱/耳机
↑
你想录这里!
你说话 → Capture Endpoint(捕获入口)→ 麦克风
↑
录屏软件默认抓这里 😭
所以不是软件坏了,是它根本没找对地方。
然后还有个更恶心的问题——
Windows 7 / 10 / 11 对"Stereo Mix"这个虚拟设备的支持程度完全不同:
| 系统 | 状态 |
|---|---|
| Win7 | 默认有,稳得很 |
| Win10 | 经常藏起来或直接禁用 |
| Win11 | 大概率没有,得手动开 |
而且不同主板声卡(Realtek / Conexant / IDT)设备名全不一样,代码里写死名字 = 换台机器直接爆炸。
🛠 四种实战方案,直接上代码
方案一:Python 快速验证(sounddevice)
适合:想先跑通逻辑、不想折腾环境的同学
python
import sounddevice as sd
import numpy as np
import wave
# 第一步:把所有音频设备打印出来,看看有哪些能用
devices = sd.query_devices()
for i, dev in enumerate(devices):
if dev['max_output_channels'] > 0:
print(f"[{i}] {dev['name']} | out:{dev['max_output_channels']}ch in:{dev['max_input_channels']}ch")
# 第二步:找到对应设备索引(Win11 需要先手动启用 Stereo Mix)
TARGET = 1 # 👈 从上面列表里改
sample_rate = 44100
channels = 2
buffer = []
def callback(indata, frames, time, status):
if status:
print(f"⚠️ {status}")
buffer.append(indata.copy())
with sd.InputStream(device=TARGET, channels=channels,
samplerate=sample_rate, callback=callback):
print("🎙️ 录制系统内部音频中...")
sd.sleep(15000)
# 第三步:存 WAV
if buffer:
data = np.concatenate(buffer).flatten()
with wave.open("sys_loopback.wav", "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(2)
wf.setframerate(sample_rate)
wf.writeframes(data.tobytes())
print(f"✅ 保存完成: sys_loopback.wav")
踩坑点:Win11 上 "Stereo Mix" 默认隐藏,需要去 声音设置 → 录制 → 右键 → 显示已禁用设备 手动开启。
方案二:FFmpeg 一条命令搞定(硬核玩家)
适合:服务器无 GUI 环境 / 批量录制
bash
# 先看看有哪些设备(名字每次都不一样!)
ffmpeg -list_devices true -f dshow -i dummy
# 找到设备名后,一行命令开录
ffmpeg -f gdigrab -framerate 30 -i desktop ^
-f dshow -i audio="Stereo Mix (Realtek High Definition Audio)" ^
-c:v libx264 -preset fast -crf 23 ^
-c:a aac -b:a 192k ^
-t 00:05:00 -y desktop_record.mp4
踩坑点:audio= 后面那串设备名,换台电脑就得重新查。别硬编码,写个脚本先枚举。
方案三:C# + NAudio(最稳,强烈推荐 ⭐)
适合:.NET 开发者 / Windows 桌面应用开发
csharp
// NuGet: Install-Package NAudio
using NAudio.Wave;
using NAudio.CoreAudioApi;
var enumerator = new MMDeviceEnumerator();
var defaultRender = enumerator.GetDefaultAudioEndpoint(
DataFlow.Render, Role.Multimedia);
Console.WriteLine($"默认播放设备: {defaultRender.FriendlyName}");
using var capture = new WasapiLoopbackCapture(defaultRender);
capture.StartRecording();
Console.WriteLine("🎙️ 开始录系统声...");
using var writer = new WaveFileWriter("naudio_loopback.wav", capture.WaveFormat);
byte[] buf = new byte[capture.WaveFormat.AverageBytesPerSecond];
for (int i = 0; i < 10; i++)
{
int read = capture.Read(buf, 0, buf.Length);
if (read > 0) writer.Write(buf, 0, read);
Thread.Sleep(1000);
}
capture.StopRecording();
Console.WriteLine("✅ 完成: naudio_loopback.wav");
为什么推荐这个? 因为 WasapiLoopbackCapture 直接从渲染端点回捞,完全绕开 Stereo Mix,Win10/11 通用,不挑声卡。
方案四:OBS Lua 脚本(非开发用户福音)
适合:主播 / 录课老师 / 不想碰代码的人
lua
obs = obslua
local name = "System_Audio_Capture"
if obs.obs_get_source_by_name(name) == nil then
local src = obs.obs_create_source(
"wasapi_output_capture", name, {device_id = "default"}, nil
)
obs.obs_source_add_active_source_to_scene(src, "Scene")
print("✅ 系统音频源已就绪: " .. name)
end
OBS 内部帮你把设备探测全做了,你只管录。
📊 方案对比(选哪个看这里)
| 方案 | 难度 | 稳定性 | 换机器能用吗 | 适合谁 |
|---|---|---|---|---|
| Python sounddevice | ⭐ | ⭐⭐⭐ | ❌ 要改 | 快速验证 |
| FFmpeg | ⭐⭐ | ⭐⭐⭐ | ❌ 要改 | 无GUI/服务器 |
| C# NAudio | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ | .NET开发 |
| OBS Lua | ⭐ | ⭐⭐⭐⭐ | ✅ | 非开发用户 |
💡 不想自己写代码?工程化产品怎么做的
说真的,上面那些坑踩一遍之后,你会发现——自己写能跑通,但维护成本巨高。
设备名每次变、权限要处理、音画要同步、降噪要加……这堆"脏活"如果每个项目都自己干,迟早疯。
所以市面上成熟的录屏工具(比如嗨格式录屏大师)做的事情本质就是:
| 它帮你干了什么 | 对应的技术痛点 |
|---|---|
| 启动自动枚举渲染端点 | 不用手动找 Stereo Mix |
| 系统声 + 麦克风声双轨独立录制 | 避免只录到环境噪音 |
| 录制前实时波形预览 | 确认有声音再开录,不翻车 |
| 内置轻量降噪 | 键盘声 / 底噪自动压 |
| GPU 硬件编码 | 低配机器也能流畅录 |
操作就四步:打开 → 选区域 → 勾系统声音 → 录。
对开发者来说,这类工具把 WASAPI 兼容性、权限管理、音视频同步封装成了黑盒,你专注内容就行,别在基础设施上浪费生命。
❓ FAQ(评论区高频问题)
Q:录屏完全没声怎么办?
先看软件里"系统音频"开了没 → 再检查 Windows 隐私 → 麦克风权限给没给 → 最后确认系统音量没静音。
Q:Win11 找不到 Stereo Mix?
去
声音设置 → 更多声音设置 → 录制 → 右键 → 显示已禁用设备,找到后启用。或者直接用 WASAPI Loopback 方案绕开。
Q:文件太大怎么压?
录的时候选 H.265 + 1080P 下 8-12Mbps,录完用 HandBrake 转。别录完再想办法,前期就控住。
Q:音画不同步?
降帧率、开硬件编码(NVENC)、专业工具封装时强制 PTS 对齐。
🎯 最后说两句
电脑录屏内录没声音这事儿,本质就是端点选错了。
从 Win7 的 Stereo Mix 到 Win11 的 WASAPI Loopback,底层逻辑其实没变——找到渲染出口,把声音捞回来。
三个takeaway:
- 原理搞通,代码只是实现方式 —— 上面四个方案随便挑一个跑通,你就不会再踩这个坑
- 别重复造轮子 —— 设备兼容、权限、同步这些事,嗨格式录屏大师这类工具已经帮你做好了
- 声音决定录屏质量 —— 画面再清晰,没声音等于白录
有问题评论区见,觉得有用点个赞 👍 回头我再写一篇音视频封装同步的。
本文代码仅供学习,生产环境请自行测试验证。录屏愉快!