如何获得 Java 中的主卷?我想制作一个程序来显示(NOT CHANGE)这个值(可能在 aJProgressBar
或类似的东西上)作为最大设置的百分比。我可能还想将当前声级显示为可能的最高声级的百分比,但这不是必需的。
4 回答
我不完全确定,但你可以看看(Java Media Framework - JMF)。您可以通过该库控制声音,因此我假设您也可以获得有关它的详细信息。这可能只是应用程序的声音级别,所以我可能错了。
虽然JProgressBar
不用于此
这可能会有所帮助
package test;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
public class SoundMeter {
JFrame j;
public SoundMeter() {
j = new JFrame("SoundMeter");
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setLayout(new BoxLayout(j.getContentPane(), BoxLayout.Y_AXIS));
printMixersDetails();
j.setVisible(true);
}
public void printMixersDetails(){
javax.sound.sampled.Mixer.Info[] mixers = AudioSystem.getMixerInfo();
System.out.println("There are " + mixers.length + " mixer info objects");
for(int i=0;i<mixers.length;i++){
Mixer.Info mixerInfo = mixers[i];
System.out.println("Mixer Name:"+mixerInfo.getName());
Mixer mixer = AudioSystem.getMixer(mixerInfo);
Line.Info[] lineinfos = mixer.getTargetLineInfo();
for(Line.Info lineinfo : lineinfos){
System.out.println("line:" + lineinfo);
try {
Line line = mixer.getLine(lineinfo);
line.open();
if(line.isControlSupported(FloatControl.Type.VOLUME)){
FloatControl control = (FloatControl) line.getControl(FloatControl.Type.VOLUME);
System.out.println("Volume:"+control.getValue());
JProgressBar pb = new JProgressBar();
// if you want to set the value for the volume 0.5 will be 50%
// 0.0 being 0%
// 1.0 being 100%
//control.setValue((float) 0.5);
int value = (int) (control.getValue()*100);
pb.setValue(value);
j.add(new JLabel(lineinfo.toString()));
j.add(pb);
j.pack();
}
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new SoundMeter();
}
}
尼科是对的。这是一篇可能对您有所帮助的文章和示例。
http://onjava.com/pub/a/onjava/excerpt/jenut3_ch17/index.html
http://onjava.com/onjava/excerpt/jenut3_ch17/examples/SoundPlayer.java
你可以少一点磨砺,而不是说“对我没有帮助”。
否则,这里是大图,使用 AlexR 的示例中提到的 Sound API:(该论坛帖子中有很多实用细节,并且有一些 Oracle 文档用于处理音频与控件)
一旦你得到一个
Line
代表你想要控制的声音输出线的对象,得到音量控制就相当简单了:line.open(); // May be necessary if the line is not already opened. FloatControl volumeControl = (FloatControl) masterLine.getControl(FloatControl.Type.VOLUME);
获取“Master
Line
”对象充其量是平台相关的。您必须在运行时使用静态方法列出Mixer
s 和s以确定您想要哪一行。也可能发生主线路不直接支持音量控制,而仅通过. (通过一个层次结构,你猜对了,依赖于平台)。Line
AudioSystem
CompoundControl