录屏软件内录没声音?这篇把坑踩明白了 🎤

0 阅读5分钟

兄弟们,有没有经历过这种崩溃时刻——

辛辛苦苦录了一小时网课 / 会议 / 游戏高光,回放一看:‌画面丝滑,声音只剩风扇呼呼转。

弹幕都在问:"老师你是在太空讲课吗?"

我自己也翻过这个车,后来扒了一圈 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:

  1. 原理搞通,代码只是实现方式‌ —— 上面四个方案随便挑一个跑通,你就不会再踩这个坑
  2. 别重复造轮子‌ —— 设备兼容、权限、同步这些事,嗨格式录屏大师这类工具已经帮你做好了
  3. 声音决定录屏质量‌ —— 画面再清晰,没声音等于白录

有问题评论区见,觉得有用点个赞 👍 回头我再写一篇音视频封装同步的。


本文代码仅供学习,生产环境请自行测试验证。录屏愉快!