2009-03-15 5 views
5

JLayer를 사용하여 인터넷에서 mp3 데이터의 입력 스트림을 재생하고 있습니다. 출력 볼륨을 어떻게 변경합니까?JLayer 사용시 Java 볼륨 변경

나는 그것을 재생이 코드를 사용하고 있습니다 :

URL u = new URL(s); 
URLConnection conn = u.openConnection(); 
conn.setConnectTimeout(Searcher.timeoutms); 
conn.setReadTimeout(Searcher.timeoutms); 

bitstream = new Bitstream(conn.getInputStream()/*new FileInputStream(quick_file)*/); 
System.out.println(bitstream); 
decoder = new Decoder(); 
decoder.setEqualizer(equalizer); 
audio = FactoryRegistry.systemRegistry().createAudioDevice(); 
audio.open(decoder); 
for(int i = quick_positions[0]; i > 0; i--){ 
    Header h = bitstream.readFrame(); 
    if (h == null){ 
     return; 
    } 
bitstream.closeFrame(); 
+0

내 대답을 참조하십시오 http://stackoverflow.com/questions/3134167/adjusting-volume-using-jlayer/17570819#17570819 – pstanton

답변

0

는 당신이 얻을하려는 볼륨의 동점의 모든 밴드를 조정 해보십시오. 어쩌면 EQFunction도 사용할 수 있습니까?

public class ChangeVolumeFunction extends EQFunction { 
    public double volume = 1.0; 
    public void setVolume(double volume) { this.volume = volume; } 
    public float getBand(int band) { return (float) (Math.log(volume)/Math.log(2) * 6.0); } 
} 
+0

공개 후에 "수업"을 잊어 버렸습니다. nitpicky :) 지금 당장 시도하고 있습니다. – Penchant

+0

doesnt는 작동하는 것처럼 보인다 :( – Penchant

7

당신은 이것을 받아 들일 수없는 해킹이라고 생각할 수도 있지만, 내가 작성한 MP3 플레이어에서 작동했습니다. JLayer 클래스 중 하나에 작은 코드 추가가 필요합니다.

javazoom.jl.player.JavaSoundAudioDevice에 다음 메소드를 추가하십시오.

public void setLineGain(float gain) 
{ 
    if (source != null) 
    { 
     FloatControl volControl = (FloatControl) source.getControl(FloatControl.Type.MASTER_GAIN); 
     float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum()); 

     volControl.setValue(newGain); 
    } 
} 

이 새로운 방법으로 다음과 같은 코드로 볼륨을 변경할 수 있습니다.

if (audio instanceof JavaSoundAudioDevice) 
{ 
    JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio; 
    jsAudio.setLineGain(yourGainGoesHere); 
} 
4

또 다른 (비 JLayer) PC의 스피커 볼륨을 조정하는 방법은 Sun/Oracle에서 제공하는 javax.sound.sampled 패키지의 클래스를 사용하는 것입니다.

내 컴퓨터에서 SPEAKER가 지원되는 유일한 출력 대상이었습니다. 나는이 응용 프로그램에서 볼륨 컨트롤을 달성하고 어떻게 이것은

import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.Line.Info; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.Port; 

public class SoundVolumeDemo 
{ 

    public static void main(String[] args) 
{   
    Info source = Port.Info.SPEAKER; 
    //  source = Port.Info.LINE_OUT; 
    //  source = Port.Info.HEADPHONE; 

     if (AudioSystem.isLineSupported(source)) 
     { 
      try 
      { 
       Port outline = (Port) AudioSystem.getLine(source); 
       outline.open();     
       FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);     
       System.out.println("  volume: " + volumeControl.getValue()); 
       float v = 0.33F; 
       volumeControl.setValue(v); 
       System.out.println(" new volume: " + volumeControl.getValue()); 
       v = 0.73F; 
       volumeControl.setValue(v); 
       System.out.println("newest volume: " + volumeControl.getValue()); 
      } 
      catch (LineUnavailableException ex) 
      { 
       System.err.println("source not supported"); 
       ex.printStackTrace(); 
      }    
     } 
    } 

} 

:

http://onebeartoe.com/media-players/randomjuke/filesystem/java-web-start/swing/index.jsp

난 단지는 MS 윈도우 OS 시스템에서 작업하는 경험이 있습니다.

+0

이것은 나를 위해 일했다. –