2009-06-04 12 views

Odpowiedz

34

Jeśli używasz API Java dźwiękowe, można ustawić poziom głośności za pomocą regulatora MASTER_GAIN.

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

Niż! Spróbuję tego. O ile warto, patrzę na problem na obu końcach. Mam klienta iPhone'a zajmującego się strumieniem audio i po prostu używając innego API na kliencie, otrzymuję inny wolumin. Więc nie sądzę, że mój problem jest całkowicie po stronie serwera. – Cliff

+4

@ markusk Jeśli pytanie dotyczy objętości, należy użyć 'FloatControl.Type.VOLUME'? –

+3

Tylko dla rekordu: kontrola głośności rzuciła wyjątek (nie jest obsługiwany), podczas gdy kontrola wzmocnienia nadrzędnego nie miała (na 'SourceDataLine'). – RedGreasel

9

można regulować głośność za pomocą gaincontrol, spróbuj coś takiego po otwarciu linia

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

Regulacja głośności w głośnikach i na jednej ścieżce to dwie zupełnie różne rzeczy. –

Powiązane problemy