Как воспроизвести mp3-файл с абсолютным именем файла?

Я нашел несколько возможных ответов на 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

Я сделал еще несколько попыток, но это то, о чем у меня есть записи.

Единственное, что у меня пока работает, это воспроизведение файлов из оболочки: на Mac,

Runtime.getRuntime().exec("afplay " + filePath);

Но я бы предпочел решение на Java. Любые идеи?


person Irina Rapoport    schedule 29.09.2016    source источник
comment
см. Java sound api. работать очень хорошо   -  person Tokazio    schedule 29.09.2016
comment
И это тоже пробовал. Не поддерживает mp3: stackoverflow.com/questions / 5667454 /   -  person Irina Rapoport    schedule 29.09.2016


Ответы (1)


  • # P1 #

Вы можете посмотреть здесь Получение файла mp3 для воспроизведения с помощью javafx

  • # P3 #

Вы можете использовать JLayer, который поддерживает .mp3.

Пример

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 причину, если приложение не будет складываться.

Вообще говоря:

Вы должны использовать внешние библиотеки для воспроизведения файлов, таких как .mp3, в Java (хотя JavaFX поддерживает .mp3, но не все форматы)

Java поддерживает только .wav

Хотя этого достаточно. Все, что вам нужно, это внешний алгоритм для воспроизведения других музыкальных форматов. Все остальные форматы исходят из .wav, они передаются в алгоритм, а затем становятся .ogg,.mp3,.whatever

1. Как упоминалось ранее для .mp3 JLayer.jar, вы можете импортировать этот jar-файл в свой проект. как внешняя библиотека.

2. JavaZoom также имеет и другие библиотеки для поддержки .ogg, .speex. , .flac, .mp3, перейдите по ссылке выше и загрузите проект jlGui. Там вы найдете библиотеки для множества форматов.

Ссылка на stackoverflow на Как воспроизводить файлы .wav с помощью java

И 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();
} 

}

person GOXR3PLUS    schedule 29.09.2016
comment
Спасибо за отличный ответ. Похоже, все решения, кроме последнего, полагаются на сторонние библиотеки. Насчет последнего - как вы думаете, он может проигрывать mp3? - person Irina Rapoport; 29.09.2016
comment
@Irina Rapoport Я отредактировал ответ, поэтому вначале он включает ссылку с решениями на JavaFX. Код в конце предназначен только для файлов .wav. Если вы хотите использовать сторонние библиотеки, такие как JLayer, это так просто, как вы импортируете .jar в проект, вы запускаете код без промедления и вуаля! - person GOXR3PLUS; 29.09.2016
comment
Спасибо за редактирование. Истинный RE сторонний .jar, но я не запускаю непонятный сторонний код, не прочитав его, и у кого есть на это время? - person Irina Rapoport; 29.09.2016
comment
@Irina Rapport :) lmao, если ты хочешь учиться, ты всегда найдешь время. + Имя Ирина происходит от древнегреческой богини мирной жизни Эйрен. На древнегреческом языке εἰρήνη означает мир, я узнал это сейчас .. - person GOXR3PLUS; 29.09.2016
comment
при воспроизведении звука всегда воспроизводится волна. воспроизведение mp3 без сжатия, затем воспроизведение звуковой волны - person Tokazio; 29.09.2016
comment
Это базовая безопасность. Помогает сохранять спокойствие :-) - person Irina Rapoport; 29.09.2016