0

谁能告诉我为什么我的音量控制不起作用...?

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.*;
import javax.swing.event.*;
/*<Applet code="kkk" height=400 width=400></Applet>*/
public class kkk extends JComponent
{
    static File f1;
    int prog;
    static JFrame jf;
    int al;
    JLabel time;
    Timer tr;
    Button b;
    int pos=0;
    Clip c;
    AudioInputStream a;
    JSlider s;
    public static void main(String args[]) 
    {
        f1=new File("mm.wav");
        jf=new JFrame();
        jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        kkk kp=new kkk(f1);
        jf.getContentPane().add(kp, "Center");
        jf.setSize(400,400);
        jf.setVisible(true);
    }
    kkk(File f1)
    {
        try
        {
            a=AudioSystem.getAudioInputStream(f1);
            AudioFormat af=a.getFormat();
            DataLine.Info di=new DataLine.Info(Clip.class,af);
            c=(Clip)AudioSystem.getLine(di);
            c.open(a);
        }
        catch(Exception e)
        {
            System.out.println("Exception caught ");
        }
        finally 
        {
            try
            {
                a.close();
            }
            catch(Exception e)
            {
                System.out.println("Exception caught ");
            }
        }
        al=(int)(c.getMicrosecondLength()/1000); 
        s=new JSlider();
        Button b=new Button("play");
        time=new JLabel();
        Box row = Box.createHorizontalBox();
        row.add(s);
        row.add(b);
        row.add(time);
        b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent eee)
        {
            play();
        }});
        s.addChangeListener(new ChangeListener(){
        public void stateChanged(ChangeEvent ee)
        {
            //repaint();
            prog=s.getValue();
            time.setText(prog / 1000 + "." + (prog % 1000) / 100);
            //if(prog!=ap)
            //skip(prog);
        }});
        tr = new javax.swing.Timer(100, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                tick();
                }
                });
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
                this.add(row);
    }
    public void play()
    {
        try
        {
            FloatControl volume = (FloatControl) c.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(-20.63f);
        }
        catch(Exception e)
        {}
        c.start();
        tr.start();
    }
    //public void skip(
    public void tick()
    {
          pos = (int) (c.getMicrosecondPosition() / 1000);
              s.setValue(pos);
    }
}
4

2 回答 2

1

音量永远不会改变,因为......你永远不会改变它!我想您希望在滑块状态更改时修改音量,因此您只需在 stateChanged 方法中设置音量。为此,您可以使用以下指令:volume.setValue(-20.63f),您已经在程序的其他地方使用过。只需将参数替换为您想要的值(例如滑块的值)。

希望这可以帮助。

于 2011-01-02T17:17:40.343 回答
0

好的,您似乎正确地进行了“音量”控制。你是说你在下面的行中输入了不同的值并且它总是听起来相同的音量?

volume.setValue(-20.63f);  

我无法想象 10 或 80 的值会做什么,因为我认为范围是 -80 到 6。而且大部分的底端几乎听不见。它应该对应于从 -80 到 6 的分贝或伏特或更典型的 VU 表。例如,我的调音台有一个范围从 -20 到 +5 的 VU 表。

无论如何,尝试 5 或 0 或 -10 之类的测试值可能更有可能听起来像某事。

此外,大多数人希望在播放过程中改变音量,作为一个动态过程,因此我们正在您的代码中寻找逻辑位置来执行此操作,例如 Timer 或 Slider。但我猜你只是想让声音以不同的硬编码声级播放,而滑块只是用于显示进度。我发现代码很难破译,以及问题的描述。

于 2011-06-21T10:05:34.530 回答