2009-03-15 45 views
5

Tôi đang sử dụng JLayer để phát luồng đầu vào của dữ liệu mp3 từ internet. Làm thế nào để tôi thay đổi âm lượng của đầu ra?Thay đổi âm lượng trong Java khi sử dụng JLayer

Tôi đang sử dụng mã này để chơi nó:

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

xem câu trả lời của tôi trên http://stackoverflow.com/questions/3134167/adjusting-volume-using-jlayer/17570819#17570819 – pstanton

Trả lời

0

Hãy thử điều chỉnh tất cả các ban nhạc của bộ cân bằng cho khối lượng bạn đang cố gắng để có được. Có lẽ bạn cũng có thể sử dụng một số EQFunction cho điều đó?

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

bạn đã quên "lớp" sau công khai. nitpicky :) Tôi đang thử ngay bây giờ. – Penchant

+0

doesnt hoạt động :( – Penchant

7

Bạn có thể coi đây là một hack không thể chấp nhận được nhưng nó hoạt động trong trình phát MP3 mà tôi đã viết. Nó đòi hỏi một sự bổ sung mã nhỏ vào một trong các lớp JLayer.

Thêm phương thức sau vào 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); 
    } 
} 

Phương pháp mới này sau đó cho phép bạn thay đổi âm lượng bằng mã như thế này.

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

Cách khác (không phải JLayer) để điều chỉnh âm lượng loa của PC là sử dụng các lớp trong gói javax.sound.sampled do Sun/Oracle cung cấp.

Trên máy của tôi, SPEAKER là mục tiêu đầu ra duy nhất được hỗ trợ.

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(); 
      }    
     } 
    } 

} 

Đây là cách tôi đạt được điều khiển âm lượng trong ứng dụng này:

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

Xin lưu ý rằng tôi đã chỉ có kinh nghiệm với nó làm việc trên máy hệ điều hành MS Windows.

+0

Điều này làm việc cho tôi. –

Các vấn đề liên quan