有谁能告诉我为什么我的音量控制不起作用......?
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);
}
}
答案 0 :(得分:1)
音量永远不会改变只是因为......你永远不会改变它! 我想你想要在滑块状态改变时修改音量,所以你只需要在stateChanged方法中设置音量。为此,您可以使用以下指令:volume.setValue(-20.63f),您已在程序的其他位置使用过该指令。只需将参数替换为您想要的值(例如滑块的值)。
希望这有帮助。
答案 1 :(得分:0)
好的,好像你正确地控制了“音量”。你是说你在下面的行中放了不同的值,它总是听起来是相同的音量?
volume.setValue(-20.63f);
我无法想象10或80的值会是什么,因为我认为范围是-80到6.而且大部分底端都是听不到的。它应该对应于-80到6或伏特的分贝或VU表更典型的分贝。我的调音台有一个VU表,例如-20到+5。
无论如何,尝试像5或0或-10这样的测试值可能会有更好的机会听起来像。
此外,大多数人都希望在播放期间更改音量,作为动态过程,因此我们在代码中寻找逻辑位置来执行此操作,例如Timer或Slider。但我想你只是试图让声音以不同的硬编码声音级别播放,而滑块只是用于显示进度。我发现代码很难破译,以及问题的描述。