我正在使用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("--------------------------");
}
}下面是控制台中产生的结果:
:Mixer支持的org.classpath.icedtea.pulseaudio.PulseAudioMixer@1404d1控件:
TargetLine可用于此混合器:
支持42种音频格式的=>接口TargetDataLine和0到1000000字节的缓冲区
目标线支持的控件:
其他音频引擎: com.sun.media.sound.DirectAudioDevice@13b8dae
Mixer支持的控件:
TargetLine可用于此混合器:
支持512个音频格式的=>接口SourceDataLine,以及至少32个字节的缓冲区
目标线支持的控件:
支持512个音频格式的=>接口剪辑,以及至少32个字节的缓冲区
目标线支持的控件:
其他音频引擎:Mixer支持的com.sun.media.sound.DirectAudioDevice@1cad7c3控件:
TargetLine可用于此混合器:
支持24种音频格式的=>接口SourceDataLine和至少32字节的缓冲区
目标线支持的控件:
支持24种音频格式的=>接口剪辑和至少32字节的缓冲区
目标线支持的控件:
其他音频引擎: com.sun.media.sound.DirectAudioDevice@1a9cf86
Mixer支持的控件:
TargetLine可用于此混合器:
支持24种音频格式的=>接口SourceDataLine和至少32字节的缓冲区
目标线支持的控件:
支持24种音频格式的=>接口剪辑和至少32字节的缓冲区
目标线支持的控件:
其他音频引擎:Mixer支持的com.sun.media.sound.PortMixer@17fd320控件:
TargetLine可用于此混合器:
=> Mic Boost源端口
目标线支持的控件:
=>捕获源端口
目标线支持的控件:
=>数字信源端口
有什么问题吗?
注意:我不是在Windows操作系统上,而是在Xubuntu (linux)操作系统上。这就是为什么我没有Java引擎,而是一个PulseAudioMixer。
发布于 2015-03-18 18:54:39
安德鲁在评论中所说的支持不同的线条是不稳定的,我也发现这是正确的。此外,音量控制,当存在时,往往是不理想的。它只能随着音频数据的每一个缓冲负载而改变音量,因此快速的变化往往会导致缓冲区之间的大级别跳变,进而导致点击或压缩效果。
我建议您自己编写控件。在Java教程中,有一个很好的示例可以作为启动结构使用,这个部分名为使用文件和格式转换器。下面有一个代码示例,标题是“读取声音文件”。请注意以下评论:
// Here, do something useful with the audio data that's
// now in the audioBytes array... 此时,您将将字节转换为PCM数据,然后将值乘以卷因子(通常是从0到1的浮点数),然后将其转换回字节进行回放。写你自己的,你可以让缓冲区变小,或者想出其他的方案来分散音量变化,这样就不会太突然了。此外,还可以建立一个函数,使从0到1的变化将更紧密地映射感知的体积。对于所有这些步骤,您可以参考以前关于StackOverflow的文章。
我刚刚想起了Java教程中关于控件的最后一部分。在这里,他们提到了自己写作的选择。不幸的是,在那个时候,他们并没有提供太多的例子。
发布于 2017-03-02 22:45:59
在Linux上的JavaSound中确实没有任何控件,即使使用最新的JDK,在使用PulseAudio时也是如此。
https://stackoverflow.com/questions/29100382
复制相似问题