【问题标题】:No JAVA sound control when I'm using Linux?使用 Linux 时没有 JAVA 声音控制?
【发布时间】:2015-05-19 22:59:16
【问题描述】:

我正在使用 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 Mixer 支持的控件:

TargetLine 可用于此混音器:

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

Target Line 支持的控件:


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

Mixer 支持的控件:

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

Mixer 支持的控件:

TargetLine 可用于此混音器:

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

Target Line 支持的控件:

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

Target Line 支持的控件:


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

TargetLine 可用于此混音器:

=> 麦克风增强源端口

Target Line 支持的控件:

=> 捕获源端口

Target Line 支持的控件:

=> 数字源端口


可能是什么问题?

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

【问题讨论】:

  • “这是我正在使用的代码的一部分” 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短,自包含,正确的例子)。 “可能是什么问题?” Java Sound 支持可能是..patchy。它在 Windows 上通常没问题,在 OS X 上经常被破坏,并且在 *nix 上通常只是部分实现。
  • 那么,我应该尝试“重写”自己需要的功能吗?这些功能是“增益”、“音量”、“静音”、“低音/中音/树形设置”……或者编写它们可能会很麻烦?

标签: java linux controls javasound mixer


【解决方案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 教程中关于控件的部分的最后一部分。在那里,他们提到了编写自己的选项。不幸的是,他们当时并没有提供太多示例。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多