簡體   English   中英

如何播放給定絕對文件名的 mp3 文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM