Audio volume control (increase or decrease) in Java

前端 未结 3 1729
借酒劲吻你
借酒劲吻你 2020-11-29 09:16

How do I increase the volume of an outgoing wav audio stream using Java? I\'m having issues with various Java TTS engines and the output volume of the synthesized speech. Is

相关标签:
3条回答
  • 2020-11-29 09:40
    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)); }
    
    }
    
    0 讨论(0)
  • 2020-11-29 09:49

    If you're using the Java Sound API, you can set the volume with the MASTER_GAIN control.

    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();
    
    0 讨论(0)
  • 2020-11-29 09:51

    You can adjust volume using a GainControl, try something like this after you have opened the line

    FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
    
    0 讨论(0)
提交回复
热议问题