LineUnavailableException for playing mp3 with java

My goal is to play mp3 file with Java. With every approach I took, it always fails with a 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(); 

Failed to fix the error:

  • Use the mp3 plugin for Sun.
  • Use third-party Jlayer library
  • Using the third-party Tritonus library
  • Transcode mp3 using Sony Sound Forge, Adobe Sound Booth, no luck.
  • Recode mp3 with different encoding rates and sample rate
  • Try using JMF
  • Use random mp3 from the Internet, which plays perfectly in other applications.
  • Read messages with the same error. None of the messages has an answer that helped solve the problem.

Here is the exception:

  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)
+4
source share
2 answers

Apparently mp3 needs to be read in one stream. This stream must be read into the second stream to decode it. The code below worked:

  // 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); 
+3
source

OK - start by turning off the MP3 files and your code.

  • Select the MP3 file that you have and play it using any MP3 player.
  • Download http://www.javazoom.net/javalayer/sources/jlayer1.0.1.zip
  • Extract jl1.0.1.jar from the zip file and put in your classpath.
  • Cut and paste the code at the end of this answer into the development environment.
  • compile and run make sure your mp3 file in step 1 is the file parameter. (In my case, I had this "C: \\ Users \\ romain \\ Music \\ Al DiMeola \\ Elegant Gypsy \\ 01 Flight over Rio Al DiMeola.mp3")
  • I tested this and it works great.

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

    }

+2
source

Source: https://habr.com/ru/post/1313981/


All Articles