使用Processing Sound库时遇音频线路不可用等错误的解决咨询
问题与解决方案
错误信息
Jun 06, 2023 5:43:01 PM com.jsyn.devices.javasound.JavaSoundAudioDevice <init> INFO: JSyn: default output latency set to 80 msec for Windows 11 javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported. at java.desktop/com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:484) at java.desktop/com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:115) at com.jsyn.devices.javasound.JavaSoundAudioDevice$JavaSoundInputStream.start(Unknown Source) at com.jsyn.engine.SynthesisEngine$EngineThread.run(Unknown Source) java.lang.NullPointerException: Cannot invoke "javax.sound.sampled.TargetDataLine.read(byte[], int, int)" because "this.line" is null at com.jsyn.devices.javasound.JavaSoundAudioDevice$JavaSoundInputStream.read(Unknown Source) at com.jsyn.devices.javasound.JavaSoundAudioDevice$JavaSoundInputStream.read(Unknown Source) at com.jsyn.engine.SynthesisEngine$EngineThread.run(Unknown Source) java.lang.RuntimeException: AudioInput stop attempted when no line created. at com.jsyn.devices.javasound.JavaSoundAudioDevice$JavaSoundInputStream.stop(Unknown Source) at com.jsyn.engine.SynthesisEngine$EngineThread.run(Unknown Source)
原代码
import processing.sound.*; SoundFile test; void setup(){ test = new SoundFile(this, "yikes.wav"); } void draw(){ test.play(); }
核心问题分析
- 重复播放导致资源冲突:
draw()方法每秒执行约60次,每次调用test.play()会反复请求音频设备,造成资源占用混乱,触发LineUnavailableException。 - 音频格式不兼容:系统不支持Sound库默认的
PCM_SIGNED 44100.0 Hz, 16 bit, stereo格式,导致无法打开音频线路。
修复步骤
1. 修正代码逻辑,避免重复触发播放
将播放逻辑移出draw()循环,只执行一次或通过交互触发:
单次播放示例:
import processing.sound.*; SoundFile test; boolean hasPlayed = false; void setup(){ test = new SoundFile(this, "yikes.wav"); } void draw(){ if(!hasPlayed){ test.play(); hasPlayed = true; } }
按键触发播放示例(更灵活):
import processing.sound.*; SoundFile test; void setup(){ test = new SoundFile(this, "yikes.wav"); } void keyPressed(){ if(key == ' '){ // 按空格键播放 test.play(); } } void draw(){ // 保持空循环即可 }
2. 转换音频文件为系统兼容格式
使用Audacity等工具将音频转换为以下参数:
- 采样率:48000Hz(Windows 11部分设备默认支持)
- 声道:单声道(若立体声格式报错)
- 位深:16位
3. 释放音频设备资源
关闭所有正在使用音频的程序(浏览器、音乐播放器、视频软件等),确保Processing能获取音频设备的独占权限。
4. 更新Processing Sound库
打开Processing的「库管理器」,找到Sound库并更新到最新版本,修复已知的兼容性问题。
5. 调整JSyn音频延迟(高级)
在setup()开头添加代码手动设置音频延迟,尝试解决设备兼容性问题:
import com.jsyn.engine.SynthesisEngine; void setup(){ SynthesisEngine.setDefaultOutputLatency(100); // 设置延迟为100ms,可根据情况调整 test = new SoundFile(this, "yikes.wav"); }
内容的提问来源于stack exchange,提问作者ShounakR2026
相关产品推荐
相关产品推荐

