2009-06-04 22 views
19

मैं जावा का उपयोग कर आउटगोइंग WAV ऑडियो स्ट्रीम की मात्रा कैसे बढ़ा सकता हूं? मुझे विभिन्न जावा टीटीएस इंजन और संश्लेषित भाषण की आउटपुट वॉल्यूम के साथ समस्याएं हैं। क्या कोई एपीआई कॉल है या डू-हिकी.जर मैं वॉल्यूम पंप करने के लिए उपयोग कर सकता हूं?जावा में ऑडियो वॉल्यूम नियंत्रण (वृद्धि या कमी)

उत्तर

34

खोला है आप जावा ध्वनि एपीआई का उपयोग कर रहे हैं, तो आप 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

thanx! मैं कोशिश करूँगा इसके लायक होने के लिए मैं दोनों सिरों पर समस्या को देख रहा हूं। मेरे पास एक ऑडियो क्लाइंट है जो ऑडियो स्ट्रीम में प्रवेश कर रहा है और क्लाइंट पर एक अलग एपीआई का उपयोग करके मुझे अलग वॉल्यूम मिलता है। इसलिए मुझे नहीं लगता कि मेरी समस्या पूरी तरह सर्वर की तरफ है। – Cliff

+4

@ markusk यदि प्रश्न मात्रा के लिए विशिष्ट है, तो 'FloatControl.Type.VOLUME' का उपयोग किया जाना चाहिए? –

+3

सिर्फ रिकॉर्ड के लिए: वॉल्यूम नियंत्रण ने एक अपवाद फेंक दिया (समर्थित नहीं) जबकि मास्टर लाभ नियंत्रण ('SourceDataLine' पर) नहीं था। – RedGreasel

9

आप एक GainControl का उपयोग कर मात्रा समायोजित कर सकते हैं, कुछ इस तरह की कोशिश के बाद आप लाइन

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

स्पीकर पर वॉल्यूम समायोजित करना और एक विशिष्ट ट्रैक पर दो पूरी तरह से अलग चीज़ें हैं। –

संबंधित मुद्दे