2016-12-26 72 views
-1

我一直在尋找某種方式來做到這一點,但我沒有在網上找到任何想法來幫助我。Java - 如何從文件播放類似.wav和.mp3的音頻文件

我有一個新的文件創建如下:File f = new File("path/to/.wav/file"); 但我找不到任何方式來播放它,我嘗試使用網絡代碼,但他們沒有奏效。

我甚至有這一點,但不會工作:

String wav = ".\\Others\\audio\\timesup.wav"; 
     Clip clip = AudioSystem.getClip(); 
     AudioInputStream inputStream = AudioSystem.getAudioInputStream(
        audioPlayer.class.getResourceAsStream(".\\Others\\audio\\timesup.wav")); 
     clip.open(inputStream); 
     clip.start(); 

你能幫助我嗎?

+0

我已經嘗試過的那一個,但沒有工作,這就是爲什麼我現在問。 –

+2

@SalmehGames閱讀此:[你的意思是「它不起作用」?](http://meta.stackexchange.com/questions/147616/what-do-you-mean-it-doesnt-work) – byxor

回答

1

這可能對你有幫助。

String soundFile = "path/to/.wav/file"; 
InputStream in = new FileInputStream(soundFile); 

// create an audiostream from the inputstream 
AudioStream audioStream = new AudioStream(in); 

// play the audio clip with the audioplayer class 
AudioPlayer.player.start(audioStream); 

請點擊此鏈接。 http://alvinalexander.com/java/java-audio-example-java-au-play-sound

+0

我知道這是正確的,但出於某種原因,我不能添加新的'AudioStream'和'AudioPlayer'。 –

+1

我發佈了我的問題,我不知道爲什麼會發生。 –

1

沒有這樣做,無需外部API

import java.io.IOException; 
import java.io.InputStream; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class AePlayWave extends Thread { 

    protected static final boolean DEBUG = false; 

    protected InputStream inputStream; 

    public AePlayWave(InputStream inputStream) { 
     this.inputStream = inputStream; 
     if (DEBUG) System.out.println("AePlayWave constructor"); 
    } 

    @Override 
    public void run() { 
     if (DEBUG) System.out.println("AePlayWave running"); 

     AudioInputStream audioInputStream = verifyInputStream(); 
     if (audioInputStream == null) { 
      return; 
     } 

     AudioFormat format = audioInputStream.getFormat(); 
     SourceDataLine audioLine = openInputStream(format); 

     if (DEBUG) System.out.println(audioLine.getLineInfo()); 

     if (audioLine != null) { 
      audioLine.start(); 
      playInputStream(audioInputStream, audioLine); 
     } 
    } 

    protected AudioInputStream verifyInputStream() { 
     if (DEBUG) System.out.println("AePlayWave verifyInputStream"); 
     AudioInputStream audioInputStream = null; 
     try { 
      audioInputStream = AudioSystem.getAudioInputStream(inputStream); 
     } catch (UnsupportedAudioFileException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return audioInputStream; 
    } 

    protected SourceDataLine openInputStream(AudioFormat format) { 
     if (DEBUG) System.out.println("AePlayWave openInputStream"); 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
     SourceDataLine audioLine = null; 
     if (DEBUG) System.out.println("AePlayWave openInputStream try"); 
     try { 
      audioLine = (SourceDataLine) AudioSystem.getLine(info); 
      if (DEBUG) System.out.println("AePlayWave openInputStream getLine"); 
      audioLine.open(format); 
      if (DEBUG) System.out.println("AePlayWave openInputStream open"); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return audioLine; 
    } 

    protected void playInputStream(AudioInputStream audioInputStream, 
      SourceDataLine audioLine) { 
     if (DEBUG) System.out.println("AePlayWave playInputStream"); 
     int externalBufferSize = (int) audioInputStream.getFrameLength() * 4; 
     if (DEBUG) System.out.println("AePlayWave playInputStream externalBufferSize: " 
       + externalBufferSize); 
     int nBytesRead = 0; 
     byte[] abData = new byte[externalBufferSize]; 

     try { 
      while (nBytesRead != -1) { 
       nBytesRead = audioInputStream.read(abData, 0, abData.length); 
       if (nBytesRead >= 0) { 
        if (DEBUG) System.out.println("Bytes read: " + nBytesRead); 
        audioLine.write(abData, 0, nBytesRead); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return; 
     } finally { 
      audioLine.drain(); 
      audioLine.close(); 
     } 
    } 
} 

的另一種方式,你可以使用它作爲

InputStream inputStream = getClass().getResourceAsStream("alarm-clock-1.wav"); 
AePlayWave playWave = new AePlayWave(inputStream); 
playWave.run(); 
相關問題