【问题标题】:Getting the system audio levels in Java在 Java 中获取系统音频电平
【发布时间】:2011-05-11 19:39:07
【问题描述】:

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

【问题讨论】:

  • 附带说明,不要为此使用进度条。主声级不是进度的衡量标准,某些操作系统会绘制一个不适合测量声级的动画条。
  • 那么它是怎么测量的呢?
  • 进度条是显示长期任务(例如复制文件)的进度条
  • 没有。进度条显示一个占整个对象长度一定百分比的条。千万不要以为它只能成长。
  • 我并没有说它只能增长......但是请阅读download.oracle.com/javase/6/docs/api/javax/swing/… - “一个可视化显示某些任务进度的组件。”该组件不会显示用户可以修改的值。 (而JSlider 是)

标签: java audio system system-sounds


【解决方案1】:

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

【讨论】:

  • 看起来像是一个视觉效果库(即音频/视频编辑)
  • 不,我以前用它写过一个音频流媒体/播放器。
  • 我相信这也很好,但它对我没有帮助
  • 如何用编码方式测量系统当前的声级?
【解决方案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();
}
}

【讨论】:

  • 它似乎只测量和设置应用程序的体积,而不是系统。
【解决方案3】:

你可以少一点粗暴,而不是说“对我没有帮助”。

否则,这里是大图,使用AlexR的例子中提到的Sound API:(有很多实用细节on that forum thread,还有一些Oracle文档Processing Audio with Controls

  • 一旦你得到一个Line 对象,它代表你想要控制的声音输出线,那么得到音量控制就相当简单了:

    line.open(); // May be necessary if the line is not already opened.
    FloatControl volumeControl = (FloatControl) masterLine.getControl(FloatControl.Type.VOLUME);
    
  • 获取“Master Line”对象充其量是依赖于平台的。您必须在运行时使用AudioSystem 静态方法列出Mixers 和Lines,以确定您想要哪一行。也可能发生主线不直接支持音量控制,而只能通过CompoundControl。 (通过一个层次结构,你猜对了,平台依赖)。

【讨论】:

  • 使用line = (Port)AudioSystem.getMixer(null).getLine(Port.Info.LINE_IN);,我得到java.lang.IllegalArgumentException: Line unsupported: LINE_IN source port
  • @Supuhstar: 1. 我怀疑你的意思是写((Port) AudioSystem.getMixer(null)).getLine(Port.Info.LINE_IN); - 这会抛出一个ClassCastException。 2. 不能保证调用AudioSystem.getMixer(null) 会产生你想要得到的Port - 计算机无法猜测你想要什么。 3. 我认为唯一可靠的方法是通过使用AudioSystem.getMixerInfo() 和类似的其他方法枚举系统的Lines 或Mixers 的某个子集,并检查每一个。 4. 如果你读过链接的论坛帖子,我就不必写第 2 点和第 3 点了。
【解决方案4】:

【讨论】:

  • 注意:两个链接现在都失效了。
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多