我正在使用JAVA声音API并且我试图在混音器和线路上获得一些控制(至少音量),但似乎没有控制权。 这是我正在使用的代码的一部分:
for (Mixer.Info mixerInfo : AudioSystem.getMixerInfo()) {
//System.out.println("MixerInfo : "+mixerInfo.getName());
if (mixerInfo.getName().compareTo("PulseAudio Mixer")==0) {
System.out.println("Java Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
mixer=AudioSystem.getMixer(mixerInfo);
System.out.println("\t Controls supported by Mixer:");
for(Control c : mixer.getControls()) {
System.out.println("\t =>" + c);
}
System.out.println("\t TargetLine availabe for this mixer : ");
for (Line.Info i : mixer.getTargetLineInfo()) {
System.out.println("\t => "+i);
System.out.println("\t\t Controls supported by Target Line :");
try {
for (Control c : AudioSystem.getLine(i).getControls()) {
System.out.println("\t\t =>"+c);
}
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("--------------------------");
//break;
} else {
//System.out.println("Other Mixer : "+AudioSystem.getMixer(mixerInfo));
System.out.println("Other Sound Audio Engine : "+AudioSystem.getMixer(mixerInfo));
mixer2=AudioSystem.getMixer(mixerInfo);
System.out.println("\t Controls supported by Mixer:");
for(Control c : mixer2.getControls()) {
System.out.println("\t =>" + c);
}
System.out.println("\t TargetLine availabe for this mixer :");
for (Line.Info i : mixer2.getSourceLineInfo()) {
System.out.println("\t => "+i);
System.out.println("\t\t Controls supported by Target Line :");
try {
for (Control c : AudioSystem.getLine(i).getControls()) {
System.out.println("\t\t =>"+c);
}
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("--------------------------");
}
}
以下是控制台中产生的结果:
Java声音音频引擎:org.classpath.icedtea.pulseaudio.PulseAudioMixer@1404d1 混音器支持的控件:
TargetLine适用于此调音台:
=>接口TargetDataLine支持42种音频格式,以及0到1000000字节的缓冲区
目标线支持的控件:
其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@13b8dae
Mixer支持的控件:
TargetLine适用于此调音台:
=>接口SourceDataLine支持512种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
=> interface Clip支持512种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@1cad7c3 混音器支持的控件:
TargetLine适用于此调音台:
=>接口SourceDataLine支持24种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
=> interface Clip支持24种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@1a9cf86
Mixer支持的控件:
TargetLine适用于此调音台:
=>接口SourceDataLine支持24种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
=> interface Clip支持24种音频格式,以及至少32字节的缓冲区
目标线支持的控件:
其他声音音频引擎:com.sun.media.sound.PortMixer@17fd320 混音器支持的控件:
TargetLine适用于此调音台:
=> Mic Boost源端口
目标线支持的控件:
=>捕获源端口
目标线支持的控件:
=>数字源端口
可能是什么问题?
注意:我不是在Windows操作系统上,而是在Xubuntu(linux)操作系统上。这就是为什么我没有Java Sound Audio Engine而是PulseAudioMixer。
答案 0 :(得分:1)
安德鲁在评论中说,支持各种线条参差不齐是我也发现的事实。此外,音量控制(如果存在)通常不太理想。它只能随着音频数据的每个缓冲区负载而改变音量,因此快速变化往往会导致缓冲区之间的大幅度跳跃,从而导致咔嗒声或拉链效应。
我建议您编写自己的控件。您可以将一个很好的示例用作Java教程中的起始结构,即Using Files and Format Convertors部分。在“读取声音文件”标题下有一个简短的代码示例。注意评论:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
此时,您将字节转换为PCM数据,然后将值乘以体积因子(通常是从0到1的浮点数),然后转换回字节以进行回放。编写自己的,你可以缩小缓冲区,或者提出其他方案来扩展音量变化,这样它就不会太突然。此外,可以进行一项功能,使从0到1的变化更接近地映射感知音量。对于所有这些步骤,您可以参考StackOverflow上的先前帖子。
我刚刚记得关于控件的Java教程部分的最后一部分。在那里,他们提到了编写自己的选项。不幸的是,他们在这一点上没有提供太多的例子。
答案 1 :(得分:0)
在使用PulseAudio时,Linux上的JavaSound确实没有控件,即使使用最新的JDK也没有。