2009-06-04 32 views

Respuesta

34

Si está utilizando la API de Java de sonido, se puede ajustar el volumen con el control 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

Gracias! Voy a intentar esto. Por lo que vale, estoy viendo el problema en ambos extremos. Tengo un cliente de iPhone que ingiere la transmisión de audio y con solo usar una API diferente en el cliente obtengo un volumen diferente. Así que no creo que mi problema sea completamente del lado del servidor. – Cliff

+4

@ markusk Si la pregunta es específica del volumen, ¿se debe usar 'FloatControl.Type.VOLUME'? –

+3

Solo para el registro: el control de volumen lanzó una excepción (no compatible) mientras que el control de ganancia maestro no lo hizo (en una 'SourceDataLine'). – RedGreasel

9

Puede ajustar el volumen usando un gaincontrol, intentar algo como esto después de haber abierto la línea

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

Ajustar el volumen en los altavoces y en una pista específica son dos cosas completamente diferentes. –

Cuestiones relacionadas