[英]How to play an mp3 file given an absolute file name?
我在 Stack Overflow 上找到了一些可能的答案,但它們很舊,而且看起來它們使用了已棄用的技術。
我需要播放一個給定絕對文件名的 mp3 文件。
這是我嘗試過的:
1.JavaFX
MediaPlayer player = new MediaPlayer(new Media(uriString));
我收到java.lang.IllegalStateException: Toolkit not initialized
。
我可能會找到一種初始化該工具包的方法,但我想知道這是否是首選方法。
2.Intellij UIUtil
final InputStream is = new FileInputStream(fileName);
UIUtil.playSoundFromStream(new Factory<InputStream>() {
@Override
public InputStream create() {
return is;
}
});
我得到Audio format is not yet supported: could not get audio input stream from input file
我做了更多的嘗試,但這是我的記錄。
到目前為止,唯一對我有用的是從 shell 播放文件:在 Mac 上,
Runtime.getRuntime().exec("afplay " + filePath);
但我更喜歡 Java 解決方案。 有任何想法嗎?
對於JavaFX
您可以在此處查看使用 javafx 播放 mp3 文件
你來了,我最喜歡的部分:
您可以使用支持.mp3 的JLayer 。
例子
new Thread(()->{
try {
FileInputStream file = new FileInputStream("path ..../audio.mp3"); //initialize the FileInputStream
Player player= new Player(file); //initialize the player
player.play(); //start the player
} catch (Exception e) {
e.printStackTrace();
}
}).start();
筆記:
請注意,如果不是應用程序將堆疊,我正在使用單獨的Thread
原因。
通常來說,一般來說:
您必須使用外部庫在Java
播放 .mp3 之類的文件(盡管JavaFX
支持 .mp3 但不是所有格式)
Java 僅支持 .wav
雖然這已經足夠了。你只需要一個外部算法來播放其他音樂格式。所有其他格式最初來自 .wav,它們傳遞到一個算法中,然后它們變成.ogg,.mp3,.whatever
1.如之前提到的.mp3
JLayer.jar您可以將此jar 作為外部庫導入到您的項目中。
2. JavaZoom也有和其他庫支持.ogg,.speex,.flac,.mp3 ,按照上面的鏈接下載jlGui
項目,你可以找到很多格式的庫。
關於如何使用 java 播放 .wav 文件的stackoverflow 鏈接
和http://alvinalexander.com/java/java-audio-example-java-au-play-sound不確定這是否仍然適用於 java 8
代碼:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AudioPlayerExample1 implements LineListener {
/**
* this flag indicates whether the playback completes or not.
*/
boolean playCompleted;
/**
* Play a given audio file.
* @param audioFilePath Path of the audio file.
*/
void play() {
File audioFile = new File("C:/Users/Alex.hp/Desktop/Musc/audio.wav");
try {
AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
AudioFormat format = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip audioClip = (Clip) AudioSystem.getLine(info);
audioClip.addLineListener(this);
audioClip.open(audioStream);
audioClip.start();
while (!playCompleted) {
// wait for the playback completes
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
audioClip.close();
} catch (UnsupportedAudioFileException ex) {
System.out.println("The specified audio file is not supported.");
ex.printStackTrace();
} catch (LineUnavailableException ex) {
System.out.println("Audio line for playing back is unavailable.");
ex.printStackTrace();
} catch (IOException ex) {
System.out.println("Error playing the audio file.");
ex.printStackTrace();
}
}
/**
* Listens to the START and STOP events of the audio line.
*/
@Override
public void update(LineEvent event) {
LineEvent.Type type = event.getType();
if (type == LineEvent.Type.START) {
System.out.println("Playback started.");
} else if (type == LineEvent.Type.STOP) {
playCompleted = true;
System.out.println("Playback completed.");
}
}
public static void main(String[] args) {
AudioPlayerExample1 player = new AudioPlayerExample1();
player.play();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.