gpt4 book ai didi

java - 如何使用Java更改主音量?

转载 作者:行者123 更新时间:2023-12-02 22:38:03 25 4
gpt4 key购买 nike

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

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)

我做错什么了吗?我在互联网上搜索了此错误,但没有发现任何有用的信息。

如何摆脱这种异常(exception)情况和/或理解这实际上意味着什么?

最佳答案

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

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-符合预期-也不起作用。因为方法getMasterOutputLine()返回null,所以它为我提供了null的主卷。

我没有胶水下一步要做什么:(
也许任何人都可以给我一些提示,甚至可以给我一个SSCCE。

关于java - 如何使用Java更改主音量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41943834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com