0

我正在使用 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 Sound Audio Engine:org.classpath.icedtea.pulseaudio.PulseAudioMixer@1404d1 Mixer 支持的控件:

TargetLine 可用于此混音器:

=> 接口 TargetDataLine 支持 42 种音频格式,以及 0 到 1000000 字节的缓冲区

Target Line 支持的控件:


其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@13b8dae

混音器支持的控件:

TargetLine 可用于此混音器:

=> 接口 SourceDataLine 支持 512 种音频格式,以及至少 32 字节的缓冲区

Target Line 支持的控件:

=> 支持 512 种音频格式的接口 Clip,以及至少 32 字节的缓冲区

Target Line 支持的控件:


其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@1cad7c3 Mixer 支持的控件:

TargetLine 可用于此混音器:

=> 接口 SourceDataLine 支持 24 种音频格式,以及至少 32 字节的缓冲区

Target Line 支持的控件:

=> 支持 24 种音频格式的接口 Clip,以及至少 32 字节的缓冲区

Target Line 支持的控件:


其他声音音频引擎:com.sun.media.sound.DirectAudioDevice@1a9cf86

混音器支持的控件:

TargetLine 可用于此混音器:

=> 接口 SourceDataLine 支持 24 种音频格式,以及至少 32 字节的缓冲区

Target Line 支持的控件:

=> 支持 24 种音频格式的接口 Clip,以及至少 32 字节的缓冲区

Target Line 支持的控件:


其他声音音频引擎:com.sun.media.sound.PortMixer@17fd320 混音器支持的控件:

TargetLine 可用于此混音器:

=> Mic Boost 源端口

Target Line 支持的控件:

=> 捕获源端口

Target Line 支持的控件:

=> 数字源端口


可能是什么问题?

注意:我不在 Windows 操作系统上,而是在 Xubuntu (linux) 操作系统上。这就是为什么我没有 Java Sound Audio Engine 而是 PulseAudioMixer 的原因。

4

2 回答 2

1

Andrew 在评论中所说的关于支持参差不齐的各种线路的内容我也发现是正确的。此外,如果存在音量控制,则通常不太理想。它只能随着音频数据的每个缓冲区负载而改变音量,因此快速变化往往会导致缓冲区之间的电平跳变大,进而导致点击或拉链效果。

我建议编写自己的控件。Java 教程中有一个很好的示例可以用作起始结构,该部分称为“使用文件和格式转换器”。在“阅读声音文件”标题下有一个代码示例。注意评论:

// Here, do something useful with the audio data that's 
// now in the audioBytes array... 

此时,您会将字节转换为 PCM 数据,然后将这些值乘以音量因子(通常是从 0 到 1 的浮点数),然后再转换回字节以进行播放。自己编写,可以使缓冲区更小,或者想出其他方案来分散音量变化,使其不会太突然。此外,可以制作一个函数,以便从 0 到 1 的变化将更接近地映射感知音量。对于所有这些步骤,您可以查阅 StackOverflow 上的先前帖子。

我只记得关于控件的 Java 教程部分的最后一部分。在那里,他们提到了编写自己的选项。不幸的是,他们在这一点上并没有提供太多的例子。

于 2015-03-18T18:54:39.483 回答
0

使用 PulseAudio 时,Linux 上的 JavaSound 中确实没有任何控件,即使使用最新的 JDK 也是如此。

于 2017-03-02T22:45:59.400 回答