我使用Linux时没有JAVA声音控制?

时间:2015-03-17 13:30:12

标签: java linux controls javasound mixer

我正在使用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。

2 个答案:

答案 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也没有。