0

0

Java怎么获取所有音频设备 Java Sound API枚举Mixer设备信息【代码】

畫卷琴夢

畫卷琴夢

发布时间:2026-02-02 09:52:37

|

453人浏览过

|

来源于php中文网

原创

Java Sound API通过AudioSystem.getMixerInfo()列出所有可用Mixer,但部分真实音频设备可能因系统权限、驱动限制或JDK版本差异未显示;需结合isLineSupported()验证实际音频能力,并用getDefaultMixer()定位默认设备。

java怎么获取所有音频设备 java sound api枚举mixer设备信息【代码】

Java Sound API怎么列出所有可用Mixer(音频设备)

Java Sound API 通过 Mixer.InfoAudioSystem.getMixerInfo() 获取系统级音频设备列表,但要注意:它返回的是 Mixer 抽象概念,不是“声卡”或“蓝牙耳机”这种直观设备名,且部分设备可能因权限、驱动或系统限制不可见。

  • AudioSystem.getMixerInfo() 返回所有已注册 Mixer 的描述信息,包括默认设备(AudioSystem.getDefaultMixer() 对应的那个)
  • 每个 Mixer.Info 包含 getName()getDescription()getVendor(),但不保证可读——Windows 上常是 “Primary Sound Driver”,macOS 可能是 “Built-in Output”,Linux ALSA 下可能是 “hw:0,0”
  • 某些后台 Mixer(如“Java Sound Sequencer”)不处理真实音频流,仅用于 MIDI 或合成,需结合 Mixer.isLineSupported() 过滤
import javax.sound.sampled.*;
import java.util.Arrays;

public class ListMixers {
    public static void main(String[] args) {
        Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
        System.out.println("共找到 " + mixerInfos.length + " 个 Mixer:\n");

        for (Mixer.Info info : mixerInfos) {
            Mixer mixer = AudioSystem.getMixer(info);
            String name = info.getName().trim();
            String desc = info.getDescription().trim();
            String vendor = info.getVendor().trim();

            // 判断是否支持基本音频线(粗筛真实音频设备)
            boolean hasTarget = mixer.isLineSupported(new Line.Info(TargetDataLine.class));
            boolean hasSource = mixer.isLineSupported(new Line.Info(SourceDataLine.class));

            System.out.printf("名称:%s%n描述:%s%n厂商:%s%n支持播放:%s|支持录音:%s%n---%n",
                    name.isEmpty() ? "(未命名)" : name,
                    desc.isEmpty() ? "(无描述)" : desc,
                    vendor.isEmpty() ? "(未知)" : vendor,
                    hasSource, hasTarget);
        }
    }
}

为什么有些真实音频设备没出现在 getMixerInfo() 结果里

不是代码写错了,而是受底层限制:

  • Windows:JDK 默认使用 DirectSound(旧)或 WASAPI(JDK 12+ 默认),但若系统禁用 WASAPI 共享模式、或 Java 进程未以正确权限运行,部分设备(尤其是 USB 音频接口、蓝牙 A2DP)可能被跳过
  • macOS:Core Audio 设备通常都能列出来,但某些第三方驱动(如 BlackHole、Loopback)需确保已启用并被 Java 进程识别
  • Linux:ALSA 后端依赖 /dev/snd/ 权限,普通用户若不在 audio 用户组中,会直接丢弃部分 Mixer;另外 PulseAudio 层有时会拦截 ALSA 调用,导致 Java 看到的是 PulseAudio Mixer 而非真实硬件
  • JDK 版本差异:JDK 8u292 之前对 WASAPI 支持不完整;JDK 17+ 在 Linux 上对 PipeWire 支持仍有限,可能漏掉新设备

如何判断哪个 Mixer 对应当前系统默认播放/录音设备

不能只靠名字匹配,得靠行为验证:

人声去除
人声去除

用强大的AI算法将声音从音乐中分离出来

下载
  • AudioSystem.getDefaultMixer() 拿到默认 Mixer,再调用 mixer.getSourceLineInfo()mixer.getTargetLineInfo() 查看它实际支持哪些线路类型
  • 尝试打开一条 SourceDataLineTargetDataLine(哪怕只 open 不 start),能成功说明该 Mixer 可用;抛出 LineUnavailableException 很可能代表设备被占用或驱动异常
  • 注意:getDefaultMixer() 返回的 Mixer 不一定在 getMixerInfo() 列表中(极少数 JDK 实现有缓存偏差),建议优先用它做主路径
try {
    Mixer defaultMixer = AudioSystem.getDefaultMixer();
    Mixer.Info defaultInfo = defaultMixer.getMixerInfo();
    System.out.println("默认 Mixer 名称:" + defaultInfo.getName());
    
    // 尝试获取播放能力
    DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class, 
        new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false));
    
    if (defaultMixer.isLineSupported(lineInfo)) {
        SourceDataLine line = (SourceDataLine) defaultMixer.getLine(lineInfo);
        line.open(); // 验证是否真可用
        System.out.println("✅ 默认 Mixer 支持并可打开播放线路");
        line.close();
    }
} catch (LineUnavailableException e) {
    System.out.println("❌ 默认 Mixer 当前不可用:" + e.getMessage());
}

Linux 下常见 Mixer 名称与对应硬件的映射关系

ALSA 后端下 Mixer 名称高度依赖 /proc/asound/cards 和 udev 规则,以下为典型情况(可通过 aplay -l 交叉验证):

立即学习Java免费学习笔记(深入)”;

  • hw:0Intel PCH主板集成声卡(Realtek ALCxxx 系列)
  • hw:1USB Audio → USB 声卡或麦克风(如 Blue Yeti、Focusrite Scarlett)
  • plughw:0,0 → ALSA 插件层包装的硬件设备(带采样率转换,更兼容但延迟略高)
  • defaultPulseAudio → PulseAudio Mixer,实际音频经其路由,Java 看到的是虚拟设备
  • sysdefault:CARD=XXXX → systemd-udev 自动命名的设备,XXXX 是声卡 ID(如 “Generic_5”),较可靠
真正难的不是枚举,而是从一堆抽象 Mixer 中稳定识别出用户想操作的那个物理设备——尤其当多个 USB 音频设备插入时,getName() 可能全都是 “USB Audio Device”。这时候得结合 getVendor() + getDescription() + 实际 open 测试,甚至需要解析 /sys/class/sound/ 下的设备属性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1206

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

235

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2180

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

399

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

576

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

489

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号