用Java获取系统音频级别

时间:2010-11-18 03:31:47

标签: java audio system system-sounds

如何使用Java获取主卷?我想制作一个程序,显示(不更改)此值(可能在JProgressBar或类似的东西上)作为最大设置的百分比。我可能还想将当前声级显示为最高可能声级的百分比,但这不是必需的。

4 个答案:

答案 0 :(得分:3)

我不完全确定,但您可以查看(Java Media Framework - JMF)。您可以通过该库控制声音,因此我认为您也可以获得有关它的详细信息。它可能只是应用程序的声级,所以我可能错了。

答案 1 :(得分:2)

虽然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();
}
}

答案 2 :(得分:0)

答案 3 :(得分:0)

你可能会少一点磨练,而不是说“不帮助我”。

否则,这是大局,使用AlexR示例中提到的Sound API :(有很多实用细节on that forum thread,并且有Processing Audio with Controls的一些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静态方法在运行时列出AudioSystemLine以确定您想要的行。主线也不会直接支持音量控制,而只能通过CompoundControl。 (通过层次结构,你猜对了,平台依赖)。