2016-12-26 183 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();