使用Java Beads库生成正弦波遇音频格式不支持错误求助
解决Beads库启动音频时的Line Unsupported错误
问题背景
Windows 10系统下使用Eclipse IDE,已安装Beads音频库,编写生成正弦波的代码时,能识别并显示音频设备名称,但启动音频时触发格式不支持的异常。
错误信息
Exception in thread "Thread-0" java.lang.IllegalArgumentException: Line unsupported: interface SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian at java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:125) at net.beadsproject.beads.core.io.JavaSoundAudioIO.create(Unknown Source) at net.beadsproject.beads.core.io.JavaSoundAudioIO$1.run(Unknown Source) at java.base/java.lang.Thread.run(Thread.java:1583)
原代码示例
import javax.sound.sampled.AudioFormat; import net.beadsproject.beads.core.AudioContext; import net.beadsproject.beads.core.io.JavaSoundAudioIO; import net.beadsproject.beads.data.Buffer; import net.beadsproject.beads.ugens.WavePlayer; public class AudioDevice { public static void main(String[] args) { // 选择音频设备 JavaSoundAudioIO jsaio = new JavaSoundAudioIO(); jsaio.selectMixer(0); // 创建音频上下文 AudioContext ac = new AudioContext(jsaio); // 输出格式信息(采样率、编码等) ac.postAudioFormatInfo(); // 创建正弦波生成器 WavePlayer wp = new WavePlayer(ac, 440.0f, Buffer.SINE); // 将正弦波接入输出设备 ac.out.addInput(wp); // 启动音频(此处触发错误) ac.start(); } }
问题原因
- 选中设备类型错误:直接选择索引0的混音器,该设备可能是麦克风等输入设备,不具备输出线路(SourceDataLine)。
- 格式不兼容:Beads默认使用大端字节序(big-endian)的音频格式,但Windows绝大多数音频设备仅支持小端字节序(little-endian),导致设备无法识别该格式。
解决方案
1. 确认并选择正确的输出设备
先遍历所有可用混音器,打印设备名称,确认哪个是扬声器、耳机这类输出设备:
// 遍历并打印所有混音器 for (int i = 0; i < jsaio.getNumMixers(); i++) { System.out.println("Mixer " + i + ": " + jsaio.getMixerName(i)); }
运行后,将jsaio.selectMixer(0)中的索引替换为实际输出设备的索引(比如1)。
2. 指定设备兼容的音频格式
手动创建小端字节序的音频格式,替换Beads的默认格式:
// 创建小端字节序的PCM格式:44100Hz、16bit、立体声、有符号、小端 AudioFormat format = new AudioFormat(44100, 16, 2, true, false); AudioContext ac = new AudioContext(jsaio, format);
3. 完整修正代码
import javax.sound.sampled.AudioFormat; import net.beadsproject.beads.core.AudioContext; import net.beadsproject.beads.core.io.JavaSoundAudioIO; import net.beadsproject.beads.data.Buffer; import net.beadsproject.beads.ugens.WavePlayer; public class AudioDevice { public static void main(String[] args) { JavaSoundAudioIO jsaio = new JavaSoundAudioIO(); // 列出所有混音器,确认输出设备索引 for (int i = 0; i < jsaio.getNumMixers(); i++) { System.out.println("Mixer " + i + ": " + jsaio.getMixerName(i)); } // 替换为实际输出设备的索引 jsaio.selectMixer(1); // 指定小端字节序的兼容格式 AudioFormat format = new AudioFormat(44100, 16, 2, true, false); AudioContext ac = new AudioContext(jsaio, format); ac.postAudioFormatInfo(); WavePlayer wp = new WavePlayer(ac, 440.0f, Buffer.SINE); ac.out.addInput(wp); ac.start(); } }
内容的提问来源于stack exchange,提问作者Scuh69
相关产品推荐
相关产品推荐

