Java中的音频音量控制(增加或减少)

Java中的音频音量控制(增加或减少),java,audio,javasound,Java,Audio,Javasound,如何使用Java增加传出wav音频流的音量?我对各种JavaTTS引擎和合成语音的输出量有问题。我可以使用API调用或doo-hickey.jar来增加音量吗?您可以使用GainControl来调整音量,请在打开线路后尝试类似的方法 FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 如果您使用的是Java Sound API,则可以使用控件设置音量 公共最终类卷控制 { 私有

如何使用Java增加传出wav音频流的音量?我对各种JavaTTS引擎和合成语音的输出量有问题。我可以使用API调用或doo-hickey.jar来增加音量吗?

您可以使用GainControl来调整音量,请在打开线路后尝试类似的方法

FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 

如果您使用的是Java Sound API,则可以使用控件设置音量

公共最终类卷控制
{
私有卷控件(){}
专用静态LinkedList扬声器=新建LinkedList();
私有最终静态void findSpeakers()
{
Mixer.Info[]mixers=AudioSystem.getMixerInfo();
用于(Mixer.Info mixerInfo:mixers)
{
如果(!mixerInfo.getName().equals(“Java声音音频引擎”))继续;
Mixer Mixer=AudioSystem.getMixer(mixerInfo);
Line.Info[]Line=mixer.getSourceLineInfo();
用于(Line.Info:Line)
{
尝试
{
Line=mixer.getLine(信息);
发言者。添加(行);
}
catch(LineUnavailableException e){e.printStackTrace();}
捕获(IllegalArgumentException iaEx){}
}
}
}
静止的
{
findSpeakers();
}
公共静态无效设置卷(浮动级别)
{
System.out.println(“将音量设置为”+电平);
用于(线路:扬声器)
{
尝试
{
line.open();
FloatControl=(FloatControl)line.getControl(FloatControl.Type.MASTER\u增益);
控制。设定值(限制(控制,水平));
}
catch(LineUnavailableException e){continue;}
catch(java.lang.IllegalArgumentException e){continue;}
}
}
专用静态浮动限制(浮动控制、浮动水平)
{返回Math.min(control.getMaximum(),Math.max(control.getMinimum(),level));}
}

Thanx!我试试这个。值得一提的是,我正在研究两端的问题。我有一个iPhone客户端接收音频流,只需在客户端上使用不同的API,就可以获得不同的音量。所以我不认为我的问题完全是服务器端的。@markusk如果问题是针对卷的,那么应该使用
FloatControl.Type.volume
?只是为了记录:卷控件引发了异常(不受支持),而主增益控件没有(在
SourceDataLine
上).调节扬声器的音量和调节某一特定音轨的音量是两件完全不同的事情。
import javax.sound.sampled.*;

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
    new File("some_file.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl = 
    (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(-10.0f); // Reduce volume by 10 decibels.
clip.start();
public final class VolumeControl
{

    private VolumeControl(){}

    private static LinkedList<Line> speakers = new LinkedList<Line>();

    private final static void findSpeakers()
    {
        Mixer.Info[] mixers = AudioSystem.getMixerInfo();

        for (Mixer.Info mixerInfo : mixers)
        {
            if(!mixerInfo.getName().equals("Java Sound Audio Engine")) continue;

            Mixer mixer         = AudioSystem.getMixer(mixerInfo);
            Line.Info[] lines   = mixer.getSourceLineInfo();

            for (Line.Info info : lines)
            {

                try 
                {
                    Line line = mixer.getLine(info);
                    speakers.add(line);

                }
                catch (LineUnavailableException e)      { e.printStackTrace();                                                                                  } 
                catch (IllegalArgumentException iaEx)   {                                                                                                       }
            }
        }
    }

    static
    {
        findSpeakers();
    }

    public static void setVolume(float level)
    {
        System.out.println("setting volume to "+level);
        for(Line line : speakers)
        {
            try
            {
                line.open();
                FloatControl control = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN);
                control.setValue(limit(control,level));
            }
            catch (LineUnavailableException e) { continue; }
            catch(java.lang.IllegalArgumentException e) { continue; }



        }
    }

    private static float limit(FloatControl control,float level)
    { return Math.min(control.getMaximum(), Math.max(control.getMinimum(), level)); }

}