2016-03-19 34 views
2

Oyunumdaki seslerimi çalmak için JLayer kullanıyorum. Müziğim (sürekli çalma) ve ses efektleri (sporadik) için bağımsız ses seviyeleri ayarlamaya çalışıyorum. Şu anda kodum ana ses seviyesini değiştiriyor, beklendiği gibi, her ikisinin de hacmini değiştiriyor. İşte ne yapmak istediğimi göstermek için bazı örnek kodlar (SSCCE-gibi olmak için bir sürü şey kestim ve bazı "hatalar" var).Farklı ses düzeylerinde aynı anda java mp3'leri oynayın

Herhangi bir yardım büyük ölçüde takdir edilecektir.

public static void playSoundOrMusic(String filename, String type) { 
    String soundFilename = ""; 

    if (type.equals("SFX")){ 
     soundFilename = "res/sounds/sfx/" + filename; 
    } else if (type.equals("MUSIC")){ 
     soundFilename = "res/sounds/music/" + filename; 
    } 

    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(soundFilename); 
    } catch (FileNotFoundException e) { 
     LOGGER.error("Sound file missing", e); 
    } 
    BufferedInputStream bis = new BufferedInputStream(fis); 

    try { 
     if (type.equals("SFX")){ 
      sfxPlayer = new Player(bis); 
     } else if (type.equals("MUSIC")){ 
      musicPlayer = new Player(bis); 
     } 
    } catch (JavaLayerException e) { 
     LOGGER.error("Sound file issue", e); 
    } catch (ArrayIndexOutOfBoundsException e) { 
     LOGGER.error("Sound file issue", e); 
    } 

    if (type.equals("SFX")){ 
     Info source = Port.Info.SPEAKER; 
     if (AudioSystem.isLineSupported(source)){ 
      try { 
       Port outline = (Port) AudioSystem.getLine(source); 
       outline.open();     
       FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);     
       volumeControl.setValue(OptionsJPanel.sfxVolume); 
      } catch (LineUnavailableException ex) { 
       LOGGER.error("Sound line issue", ex); 
      } 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         sfxPlayer.play(); 
        } catch (Exception ex) { 
         LOGGER.error("Sound(sfx) playing issue", ex); 
        } 
       } 
      }).start(); 
     } 
    } 

    if (type.equals("MUSIC")){ 
     Info source = Port.Info.SPEAKER; 
     if (AudioSystem.isLineSupported(source)){ 
      try { 
       Port outline = (Port) AudioSystem.getLine(source); 
       outline.open();     
       FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);     
       volumeControl.setValue(OptionsJPanel.musicVolume); 
      } catch (LineUnavailableException ex) { 
       LOGGER.error("Sound line issue", ex); 
      } 

      new Thread(new Runnable() { 
       String threadFilename = filename; 
       @Override 
       public void run() { 
        try { 
         musicPlayer.play(); 
         while(!musicPlayer.isComplete()){ 
          Thread.currentThread(); 
          Thread.sleep(1000); 
         } 
         playSoundOrMusic(threadFilename, type); 
        } catch (Exception ex) { 
         LOGGER.error("Sound(music) playing issue", ex); 
        } 
       } 
      }).start(); 
     } 
    } 
} 
+0

@gpasch cevabınız nereye gitti? Uygulamayı bitirdim ve harika çalışıyor. Bounty atanamadı :( – KisnardOnline

cevap

2

ara belleğe alınmış giriş akışı vardır: Okumak, verileri işlemek (0.5 (% 50 değerini azaltmak)), daha sonra, yeni bir akımı içine koyun ve ikinci oyuncu oyun.

BufferedInputStream bis = new BufferedInputStream(fis); 
ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 
byte[] data=new byte[1024]; 
while((k=audioInputStream.read(data, 0, data.length))>-1) { 
    for(int i=0; i<k; i++) data[i]=(byte)(0.5*data[i]); 
    outputStream.write(data, 0, k); 
} 
byte[] audioData=outputStream.toByteArray(); 
InputStream bis2=new ByteArrayInputStream(outData);  
player2.play(bis2); 

- İşte

işlemek ve bir dosya oynayacak bir sınıftır; method processPlay(), yukarıda belirtildiği gibi belirli bir kesir (0.5) ile azaltmak için ayarlanabilir - bu yöntemi ile kendi yönteminizi oluşturabilirsiniz.

import javax.sound.sampled.*; 
import java.io.*; 
import java.net.*; 
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; 

public class QHPlayer { 

public void play(String f) { 
    int k=0; 
    AudioFormat targetFormat=null; 
    try { 
    AudioInputStream audioInputStream=openFile(f); 
    targetFormat=audioInputStream.getFormat(); 
    byte[] data=new byte[1024]; 
    DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, targetFormat); 
    SourceDataLine line=null; 
     line=(SourceDataLine)AudioSystem.getLine(dinfo); 
     if(line!=null) { 
     line.open(targetFormat); 
     line.start(); 
     while((k=audioInputStream.read(data, 0, data.length))>-1) { 
      line.write(data, 0, k); 
     } 
     line.stop(); 
     line.close(); 
    } 
    } 
    catch(Exception ex) { ex.printStackTrace(); } 
} 

public void processPlay(String f) { 
    int k=0; 
    AudioFormat targetFormat=null; 
    ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 
    try { 
    AudioInputStream audioInputStream=openFile(f); 
    targetFormat=audioInputStream.getFormat(); 
    byte[] data=new byte[1024]; 

    while((k=audioInputStream.read(data, 0, data.length))>-1) 
     outputStream.write(data, 0, k); 
    byte[] b=outputStream.toByteArray(); 
    for(k=0; k<b.length; k++) b[k]=(byte)(0.5*b[k]); 


    DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, targetFormat); 
    SourceDataLine line=null; 
     line=(SourceDataLine)AudioSystem.getLine(dinfo); 
     if(line!=null) { 
     line.open(targetFormat); 
     line.start(); 
     System.out.println(line.available()); 
     k=0; 
     while(k<b.length) { 
     System.out.println(line.available()); 
      int i=line.write(b, k, 8*1024); 
      k+=i; 
     } 
     } 
     line.stop(); 
     line.close(); 
    } 
    catch(Exception ex) { ex.printStackTrace(); } 
} 

public void play(byte[] b) { 
    int k=0; 
    AudioFormat targetFormat=getAudioFormat(); 
    try { 
    DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, targetFormat); 
    SourceDataLine line=null; 
     line=(SourceDataLine)AudioSystem.getLine(dinfo); 
     if(line!=null) { 
     line.open(targetFormat); 
     line.start(); 
     while(k<b.length) { 
      int i=line.write(b, k, 8*1024); 
      k+=i; 
     } 
     line.stop(); 
     line.close(); 
    } 
    } 
    catch(Exception ex) { ex.printStackTrace(); } 
} 



    public AudioInputStream openFile(String file) { 
    AudioInputStream audioInputStream=null; 
    try { 
     File fileIn = new File(file); 
     if(file.endsWith(".mp3")) 
     audioInputStream=createMp3(fileIn); 
     else 
     audioInputStream=AudioSystem.getAudioInputStream(fileIn); 
    } 
    catch(Exception ex) { ex.printStackTrace(); } 
    return audioInputStream; 
    } 


    AudioInputStream createMp3(File fileIn) throws IOException, Exception { 
    AudioInputStream audioInputStream=null; 
    AudioFormat targetFormat=null; 
    try { 
     AudioInputStream in=null; 
     MpegAudioFileReader mp=new MpegAudioFileReader(); 
     in=mp.getAudioInputStream(fileIn); 
     AudioFormat baseFormat=in.getFormat(); 
     targetFormat=new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, 
       baseFormat.getSampleRate(), 
       16, 
       baseFormat.getChannels(), 
       baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), 
       false); 
     audioInputStream=AudioSystem.getAudioInputStream(targetFormat, in); 
    } 
    catch(UnsupportedAudioFileException ue) { System.out.println("\nUnsupported Audio"); } 
    return audioInputStream; 
    } 


    AudioFormat getAudioFormat() { 
    float sampleRate = 44100F; 
    int sampleSizeInBits = 16; 
    int channels = 2; 
    boolean signed = true; 
    boolean bigEndian = true; 
    return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); 
    } 


    public static void main(String args[]) { 
    QHPlayer q=new QHPlayer(); 
    q.processPlay("c:/.....mp3"); 
    } 

} 
+0

Ben audioInputStream bis olmak için değiştirilmiş? Int k = 0 ekledim; outData AudioData olmak için değiştirdim? İşe yaramadı - müzik tüm bozuk ... havlayan köpek gibi geliyor ... Herhangi bir düşünce? – KisnardOnline

+0

muhtemelen Oyuncu – gpasch

+0

ile yapması gerekiyorsa, kesinlikle oyuncu "Mpeg akışı" oynayabileceğini söylüyor - bu yüzden bayt akışı çalmayacak - belki başka bir çözüm için bekleyebilirsin - aksi takdirde Line – gpasch