Java - 如何从文件播放类似.wav和.mp3的音频文件
问题描述:
我一直在寻找某种方式来做到这一点,但我没有在网上找到任何想法来帮助我。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();
你能帮助我吗?
答
这可能对你有帮助。
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
我发布了我的问题,我不知道为什么会发生。 –
答
没有这样做,无需外部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();
我已经尝试过的那一个,但没有工作,这就是为什么我现在问。 –
@SalmehGames阅读此:[你的意思是“它不起作用”?](http://meta.stackexchange.com/questions/147616/what-do-you-mean-it-doesnt-work) – byxor