You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4B下如何用Java获取音频设备数组并指定播放设备?

在树莓派4B上通过Java指定音频输出设备播放音频

完全可以通过Java代码获取所有音频输出设备并指定其一播放,针对你遇到的javax.sound.sampled.Clip和LibGDX Sound API默认走3.5mm插孔的问题,以下是具体解决方案:

一、使用javax.sound.sampled原生API实现

1. 枚举所有可用音频输出设备

通过AudioSystem.getMixerInfo()遍历系统中的音频设备,筛选出支持输出的设备(支持SourceDataLine或Clip):

import javax.sound.sampled.*;

public class AudioDeviceManager {
    public static void listOutputDevices() {
        Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
        for (int i = 0; i < mixerInfos.length; i++) {
            Mixer.Info info = mixerInfos[i];
            Mixer mixer = AudioSystem.getMixer(info);
            // 判断是否为输出设备
            boolean supportsOutput = mixer.isLineSupported(Line.Info.getLineInfo(SourceDataLine.class))
                    || mixer.isLineSupported(Line.Info.getLineInfo(Clip.class));
            if (supportsOutput) {
                System.out.printf("设备索引 %d: 名称=%s,描述=%s%n", i, info.getName(), info.getDescription());
            }
        }
    }
}

运行这段代码后,你会看到树莓派上的3.5mm、HDMI1、HDMI2对应的设备信息,记录下目标设备的索引或名称。

2. 指定设备播放音频

不要使用默认的AudioSystem.getClip(),而是从选中的设备中获取Clip实例:

public static void playOnSpecificDevice(int targetDeviceIndex, String audioFilePath) throws Exception {
    Mixer.Info[] mixerInfos = AudioSystem.getMixerInfo();
    Mixer.Info targetMixerInfo = mixerInfos[targetDeviceIndex];
    Mixer targetMixer = AudioSystem.getMixer(targetMixerInfo);

    // 加载音频文件
    AudioInputStream audioStream = AudioSystem.getAudioInputStream(new java.io.File(audioFilePath));
    AudioFormat format = audioStream.getFormat();
    DataLine.Info clipLineInfo = new DataLine.Info(Clip.class, format);

    // 从指定设备获取Clip并播放
    Clip clip = (Clip) targetMixer.getLine(clipLineInfo);
    clip.open(audioStream);
    clip.start();

    // 等待播放结束
    Thread.sleep(clip.getMicrosecondLength() / 1000);
    // 释放资源
    clip.close();
    audioStream.close();
}

二、针对LibGDX Sound API的解决方案

LibGDX底层依赖OpenAL,默认可能未正确识别树莓派的多音频设备,需通过指定OpenAL设备来切换输出:

1. 启动时指定设备(推荐)

在启动JVM时添加系统属性,指定目标设备名称(设备名称可通过树莓派终端命令aplay -L查询,例如bcm2835 HDMI 1对应HDMI1输出):

java -Dorg.lwjgl.openal.ALCdevice="bcm2835 HDMI 1" -jar your-libdx-app.jar

2. 代码中动态指定

在LibGDX初始化音频模块前设置系统属性:

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;

public class MyLibGDXGame extends ApplicationAdapter {
    @Override
    public void create() {
        // 指定目标音频设备名称
        System.setProperty("org.lwjgl.openal.ALCdevice", "bcm2835 HDMI 2");
        // 初始化音频并播放
        Sound sound = Gdx.audio.newSound(Gdx.files.internal("music.wav"));
        sound.play(1.0f);
    }
}

注意事项

  • 确保树莓派已安装必要的音频库:执行sudo apt-get install libopenal-dev安装OpenAL依赖。
  • 通过aplay -L命令确认设备名称时,注意区分hw:0,0(3.5mm)、hw:0,1(HDMI1)、hw:0,2(HDMI2)等硬件设备标识,也可直接使用友好名称如bcm2835 HDMI 1。
  • 若遇到权限问题,确保当前用户属于audio用户组:执行sudo usermod -aG audio pi。

内容的提问来源于stack exchange,提问作者Alexander Gorodilov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:04:59