惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
Jina AI
Jina AI
N
Netflix TechBlog - Medium
量子位
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
I
InfoQ
J
Java Code Geeks
T
Tailwind CSS Blog
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
腾讯CDC

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
ClassIn 在 Linux 下无法播放音频
145a · 2026-05-23 · via 博客园_首页

我在 Debian (KDE Plasma) 系统上使用 ClassIn 时,发现无法播放任何音频。其他应用程序(如浏览器、媒体播放器)声音正常,仅 ClassIn 存在问题。ClassIn 的音频输出设备选项中也仅有 "default" 一项,无法手动选择其他设备。

环境

  • 系统:Debian Testing
  • 内核:7.0.7+deb14-amd64
  • 桌面环境:KDE Plasma 6.6.5
  • 音频服务:PipeWire
  • 外接显示器无扬声器
  • ClassIn 版本:6.0.6

音频设备排查

从 ClassIn 官方得知,ClassIn 使用 ALSA。

aplay -l

输出如下:

**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

系统有两个声卡:

  • card 0:HDA Intel HDMI,对应 HDMI 输出
  • card 1:HDA Intel PCH (ALC3232 Analog),对应耳机孔或内置扬声器

由于 ALSA 的 "default" 设备通常指向 card 0,而我的 HDMI 显示器并没有扬声器,这意味着 ClassIn 的声音可能被送到了一个没有输出能力的设备上。

HDMI 显示器排查

那么问题来了:我的显示器没有任何扬声器。为什么系统会认为它是一个音频输出设备?

读取显示器的 EDID 信息:

edid-decode /sys/class/drm/card0-HDMI-A-2/edid

输出中 CTA-861 Extension Block 部分仅包含 Video Data Block 和 Vendor-Specific Data Block,完全没有 Audio Data Block 和 Speaker Allocation Data Block。这说明显示器已经如实向系统报告了自己不支持音频。

那为什么系统还觉得我的显示器有扬声器?搜索得知,Linux 内核的 HDA HDMI 驱动(snd-hda-codec-hdmi)的设计策略是为所有 HDMI 输出端口创建音频设备,而不会根据 EDID 中的音频信息自动禁用无用的端口。

调换声卡顺序

既然 card 0 指向了一个没有扬声器的 HDMI 设备,一个自然的思路是让 PCH 声卡排到第一位,这样 ALSA 的 "default" 就会指向它。

编辑 /etc/modprobe.d/alsa-reorder.conf

options snd-hda-intel index=1,0

index=1,0 的作用是将先被内核发现的 HDMI 设备降为 card 1,后被发现的 PCH 设备提为 card 0。

我重启设备。再打开ClassIn,依然没有声音。

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

此时 PCH 已经成功变为 card 0。配置生效了,但没有解决问题。

ALSA default 设备排查

speaker-test -t wav -c 2

输出:

speaker-test 1.2.15.2
Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
WAV file(s)
ALSA lib pcm_dmix.c:1000:(snd_pcm_dmix_open) [error.pcm] unable to open slave
Playback open error: -16,Device or resource busy

Device or resource busy。这说明声卡硬件已经被其他进程占用,ALSA 无法直接访问。

查看谁占用了音频设备:

fuser -v /dev/snd/*

输出:

                     USER        PID ACCESS COMMAND
/dev/snd/controlC0:  user       1114 F.... pipewire
                     user       1175 F.... wireplumber
/dev/snd/controlC1:  user       1175 F.... wireplumber
/dev/snd/pcmC0D0p:   user       1114 F...m pipewire
/dev/snd/seq:        user       1114 F.... pipewire

PipeWire 占用了 /dev/snd/pcmC0D0p(即 card 0 的播放设备)。这正是 ClassIn 想要访问的设备。

pactl info 2>&1 | head -5

输出:

Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 156

系统使用的是 PipeWire(兼容 PulseAudio 接口)。ALSA 声卡硬件设备被占用了

分析

  1. PipeWire 作为系统音频服务,直接占用了 ALSA 声卡硬件设备
  2. ClassIn 尝试通过 ALSA 的 "default" 设备直接访问硬件
  3. 由于硬件已被 PipeWire 独占,ClassIn 无法打开设备,播放失败
  4. 其他应用声音正常,是因为它们通过 PipeWire(PulseAudio 兼容接口)播放,而非直接操作 ALSA 硬件

解决

pipewire-alsa 包提供了 ALSA 到 PipeWire 的兼容层。

sudo apt install pipewire-alsa

ALSA 的 "default" 设备被重定向到 PipeWire,而非直接访问硬件。

speaker-test -t wav -c 2

这次系统不再报错,也能正常听到测试声音。打开 ClassIn,音频能播放了。

总结

在 Debian 12+(默认使用 PipeWire)下,某些应用(如 ClassIn)直接通过 ALSA 播放音频时可能失败。其根本原因是 PipeWire 独占了声卡硬件设备,导致直接访问 ALSA 硬件的应用无法播放。

排查过程中,我发现 ALSA default 设备指向了无扬声器的 HDMI 输出,并尝试调换声卡顺序,但这一步并未解决问题——系统用 PipeWire 作为音频服务。

最终的解决方案是安装 pipewire-alsa。它将 ALSA 请求桥接到 PipeWire,使其能正常播放。如果你的 ClassIn 在 Linux 上无法出声,且系统使用 PipeWire,可以检查该包是否已安装。