【问题标题】:Audio volume control (increase or decrease) in JavaJava中的音频音量控制(增加或减少)
【发布时间】:2009-06-04 23:20:27
【问题描述】:

如何使用 Java 增加传出 wav 音频流的音量?我遇到了各种 Java TTS 引擎和合成语音的输出量的问题。我可以使用 API 调用或 doo-hickey.jar 来提高音量吗?

【问题讨论】:

    标签: java audio javasound


    【解决方案1】:

    如果您使用 Java Sound API,则可以使用 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();
    

    【讨论】:

    • 谢谢!我会试试这个。对于它的价值,我正在寻找两端的问题。我有一个接收音频流的 iPhone 客户端,只需在客户端上使用不同的 API,我就会得到不同的音量。所以我不认为我的问题完全是服务器端的。
    • @markusk 如果问题是针对卷的,应该使用FloatControl.Type.VOLUME 吗?
    • 仅作记录:音量控制抛出异常(不支持)而主增益控制没有(在SourceDataLine上)。
    【解决方案2】:

    您可以使用增益控制来调节音量,打开线路后尝试这样的操作

    FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
    

    【讨论】:

      【解决方案3】:
      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)); }
      
      }
      

      【讨论】:

      • 在扬声器和特定轨道上调整音量是完全不同的两件事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      相关资源
      最近更新 更多