LineUnavailableException для воспроизведения mp3 с java - PullRequest
4 голосов
/ 27 июня 2010

Моя цель - воспроизвести mp3-файл с Java. С каждым подходом, который я выбрал, он всегда терпит неудачу с LineUnavailableException.

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new URL("http://localhost:8080/agriserver/facebook/sound/test6.mp3"));
    Clip clip = AudioSystem.getClip(info);
    clip.open(inputStream);
    clip.start();

Неудачные попытки исправить это:

  • Используйте плагин Sun's mp3.
  • Использовать стороннюю библиотеку Jlayer
  • Использовать стороннюю библиотеку Tritonus
  • Перекодируйте mp3 с помощью Sony Sound Forge, Adobe Sound Booth, все не повезло
  • Перекодировать mp3 с разными скоростями кодирования и частотой дискретизации
  • Попробуйте использовать JMF
  • Используйте случайный mp3 из Интернета, который хорошо воспроизводится в других приложениях
  • Читайте сообщения с той же ошибкой. Ни в одной публикации нет ответа, который помог бы решить проблему.

Вот исключение:

Exception in thread "main" javax.sound.sampled.LineUnavailableException: line with format MPEG1L3 48000.0 Hz, unknown bits per sample, stereo, unknown frame size, 41.666668 frames/second,  not supported.
    at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:494)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(DirectAudioDevice.java:1280)
    at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1061)
    at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1151)
    at Demo.playMp3(Demo.java:83)

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Видимо, mp3 нужно читать в один поток. Этот поток должен быть прочитан во второй поток для его декодирования. Код ниже работал:

        // read the  file
        AudioInputStream rawInput = AudioSystem.getAudioInputStream(new ByteArrayInputStream(data));

        // decode mp3
        AudioFormat baseFormat = rawInput.getFormat();
        AudioFormat decodedFormat = new AudioFormat(
            AudioFormat.Encoding.PCM_SIGNED, // Encoding to use
            baseFormat.getSampleRate(),   // sample rate (same as base format)
            16,               // sample size in bits (thx to Javazoom)
            baseFormat.getChannels(),     // # of Channels
            baseFormat.getChannels()*2,   // Frame Size
            baseFormat.getSampleRate(),   // Frame Rate
            false                 // Big Endian
        );
        AudioInputStream decodedInput = AudioSystem.getAudioInputStream(decodedFormat, rawInput);
2 голосов
/ 27 июня 2010

ОК. Начнем с исключения файлов MP3 и вашего кода.

  1. Выберите файл MP3, который у вас есть, и играйте на любом MP3-плеере.
  2. Скачать http://www.javazoom.net/javalayer/sources/jlayer1.0.1.zip
  3. Извлеките jl1.0.1.jar из zip-файла и поместите в свой classpath
  4. Вырежьте и вставьте код в конце этого ответа в вашу среду разработки.
  5. скомпилируйте и запустите, чтобы убедиться, что ваш mp3 Файл на шаге 1 является параметром файл. (В моем случае у меня было это "C: \\ Users \\ romain \\ Music \\ Al DiMeola \\ Elegant Gypsy \\ 01 Полет над Рио-Аль-DiMeola.mp3")
  6. Я проверил это, и он отлично работает.

    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import javazoom.jl.player.Player;
    
    public class MP3 {
        private String filename;
        private Player player; 
    
    // constructor that takes the name of an MP3 file
    public MP3(String filename) {
        this.filename = filename;
    }
    
    public void close() { if (player != null) player.close(); }
    
    // play the MP3 file to the sound card
    public void play() {
        try {
            FileInputStream fis     = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            player = new Player(bis);
        }
        catch (Exception e) {
            System.out.println("Problem playing file " + filename);
            System.out.println(e);
        }
    
        // run in new thread to play in background
        new Thread() {
            public void run() {
                try { player.play(); }
                catch (Exception e) { System.out.println(e); }
            }
        }.start();
    }
    
    // test client
    public static void main(String[] args) {
        String filename = args[0];
        MP3 mp3 = new MP3(filename);
        mp3.play();
    }
    

    }

...