树莓派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
相关产品推荐
相关产品推荐

