【问题标题】:How to change Master Volume with Java?如何使用 Java 更改主卷?
【发布时间】:2017-02-02 21:52:01
【问题描述】:

我正在尝试编写一个小程序来更改给定设备的主音量。目前看起来是这样的

import java.util.*;
import javax.sound.sampled.*;

public class VolumeControl {

    public static void main(String[] args) throws Exception {
        Mixer mixer = findMixer(args[0]);

        changeVolume(mixer, Integer.valueOf(args[1]));
    }

    private static Mixer findMixer(String name) {
        Mixer.Info mixerInfo = Arrays.stream(AudioSystem.getMixerInfo())
            .filter(info -> name.equals(info.getName()))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(String.format("no mixer with the name '%s' found", name)));
        return AudioSystem.getMixer(mixerInfo);
    }

    private static void changeVolume(Mixer mixer, int level) throws LineUnavailableException {
        for(Line.Info info : mixer.getSourceLineInfo()) {
            try(Line line = mixer.getLine(info)) {
                if (!line.isOpen()) line.open();

                FloatControl control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
                control.setValue(limit(control.getMinimum(), control.getMaximum(), (float) level));
            }
        }
    }

    private static float limit(float min, float max, float level) {
        return Math.min(max, Math.max(min, level));
    }
}

当我使用我的设备名称编译和运行它时,我总是得到以下异常

Exception in thread "main" java.lang.IllegalArgumentException: illegal call to open() in interface Clip
        at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(Unknown Source)
        at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
        at com.sun.media.sound.AbstractDataLine.open(Unknown Source)
        at VolumeControl.changeVolume(VolumeControl.java:23)
        at VolumeControl.main(VolumeControl.java:9)

我做错了吗?我在互联网上搜索了这个错误,但没有发现任何有用的东西。

我怎样才能摆脱这个异常和/或理解这实际上意味着什么?

【问题讨论】:

  • 答案已经是here。您的例外的第一个 Google 结果。 (我会标记,但我不小心删除了我的标记)
  • 我也看到了那个帖子..但是这家伙想播放音频文件。我只想改变声音界面的主音量
  • 上下文无关紧要,答案中提供了您的异常的解决方案..

标签: java audio


【解决方案1】:

我已经更新了我的代码。现在看起来像这样

import java.util.*;
import javax.sound.sampled.*;

public class VolumeControl {

    public static void main(String[] args) throws Exception {
        Mixer mixer = findMixer(args[0]));

        changeVolume(mixer, Integer.valueOf(args[1]));
    }

    private static Mixer findMixer(String name) {
        Mixer.Info mixerInfo = Arrays.stream(AudioSystem.getMixerInfo())
            .filter(info -> name.equals(info.getName()))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException(String.format("no mixer with the name '%s' found", name)));
        return AudioSystem.getMixer(mixerInfo);
    }

    private static void changeVolume(Mixer mixer, int level) throws LineUnavailableException {
        for(Line.Info info : mixer.getSourceLineInfo()) {
            Line line = mixer.getLine(info);
            boolean shouldOpen = !(line.isOpen() || line instanceof Clip);
            try {
                if (shouldOpen) line.open();

                FloatControl control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
                control.setValue(limit(control.getMinimum(), control.getMaximum(), (float) level));
            } finally {
                if (shouldOpen) {
                    line.close();
                }
            }
        }
    }

    private static float limit(float min, float max, float level) {
        return Math.min(max, Math.max(min, level));
    }
}

现在我没有收到任何异常,但主卷无论如何都不会改变。

我也尝试使用mixer.getTargetLineInfo(),但音量也没有改变。

我了解到在 Windows Vista 中引入了一种新的声音架构,因此我尝试创建一个 exe 文件并在 Windows XP 兼容模式下运行它,结果相同。

经过一些研究,我发现this class - 正如预期的那样 - 也不起作用。它给了我一个 null 的主音量,因为 getMasterOutputLine() 方法返回 null。

我没有胶水接下来该做什么:( 也许你们中的任何人都可以给我一些提示,甚至是 SSCCE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多