2009-06-04 8 views
19

Wie erhöhe ich die Lautstärke eines ausgehenden wav Audio-Streams mit Java? Ich habe Probleme mit verschiedenen Java TTS-Engines und dem Ausgabevolumen der synthetisierten Sprache. Gibt es einen API-Aufruf oder ein doo-hickey.jar, mit dem ich die Lautstärke erhöhen kann?Audiolautstärkeregler (erhöhen oder verringern) in Java

Antwort

34

geöffnet haben Falls Sie das Java Sound-API verwenden, können Sie die Lautstärke mit dem MASTER_GAIN Steuerung einstellen.

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

Thanx! Ich werde es versuchen. Für was es wert ist, betrachte ich das Problem an beiden Enden. Ich habe einen iPhone-Client, der den Audio-Stream aufnimmt, und durch die Verwendung einer anderen API auf dem Client erhalte ich ein anderes Volumen. Ich glaube also nicht, dass mein Problem ausschließlich auf der Serverseite liegt. – Cliff

+4

@ markusk Wenn die Frage für das Volumen spezifisch ist, sollte 'FloatControl.Type.VOLUME' verwendet werden? –

+3

Nur für den Rekord: der Lautstärkeregler hat eine Ausnahme (nicht unterstützt), während die Master-Gain-Kontrolle nicht (auf einer "SourceDataLine"). – RedGreasel

9

Sie Lautstärke kann eine GainControl verwenden, so etwas wie dies versuchen, nachdem Sie die Linie

FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
1
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

Das Einstellen der Lautstärke von Lautsprechern und einer bestimmten Spur sind zwei völlig verschiedene Dinge. –

Verwandte Themen