无法从输入流中获取音频输入流

时间:2016-01-23 23:08:17

标签: java javasound

我想在代码中提供的URL处获取声音文件并播放它(它是mp3格式)。我查看了与此问题相关的一些Stack Overflow问题,他们都说我得到mp3plugin.jar

在Eclipse中,我在配置构建路径下将其添加为外部jar(因为它位于我的Downloads文件夹中,不确定它是否是最适合它的地方)。我再次运行它仍然给我这个错误:

  

javax.sound.sampled.UnsupportedAudioFileException:无法从输入流中获取音频输入流
      在javax.sound.sampled.AudioSystem.getAudioInputStream(未知来源)
      在Starter.main(Starter.java:21)

以下是代码:

public class Starter {

    public static void main(String[] args) {
        AudioInputStream din = null;
        try {
            URL url = new URL("http://c5.rbxcdn.com/2e6d33a5b3b1d8f250c395816ff9f145");
            HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
            InputStream bufferedIn = new BufferedInputStream(httpcon.getInputStream());
            AudioInputStream in = AudioSystem.getAudioInputStream(bufferedIn);
            AudioFormat baseFormat = in.getFormat();
            AudioFormat decodedFormat = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED,
                    baseFormat.getSampleRate(), 16, baseFormat.getChannels(),
                    baseFormat.getChannels() * 2, baseFormat.getSampleRate(),
                    false);
            din = AudioSystem.getAudioInputStream(decodedFormat, in);
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, decodedFormat);
            SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
            if(line != null) {
                line.open(decodedFormat);
                byte[] data = new byte[4096];
                // Start
                line.start();

                int nBytesRead;
                while ((nBytesRead = din.read(data, 0, data.length)) != -1) {
                    line.write(data, 0, nBytesRead);
                }
                // Stop
                line.drain();
                line.stop();
                line.close();
                din.close();
            }

        }
        catch(Exception e) {
            e.printStackTrace();
        }
        finally {
            if(din != null) {
                try { din.close(); } catch(IOException e) { }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要获得http://www.javazoom.net/mp3spi/docs/doc1.9.4/javazoom/spi/mpeg/sampled/file/MpegAudioFileReader.html

下载罐子。我有我的类路径

.;C:\Vision\Audio\libs\vorbisspi1.0.3.jar;C:\Vision\Audio\libs\tritonus_share.jar;C:\Vision\Audio\libs\tritonus_remaining-0.3.6.jar;C:\Vision\Audio\libs\jorbis-0.0.15.jar;C:\Vision\Audio\libs\jogg-0.0.7.jar;C:\Vision\Audio\libs\jl1.0.jar;C:\Vision\Audio\libs\mp3spi1.9.4.jar;

你可能只需要mp3spi1.9.4.jar - 其中一些是针对其他格式的,但我不确定所以我将它们全部包含在内。

然后有以下程序

  public AudioInputStream readMP3URL(String f) {
AudioInputStream audioInputStream=null;
AudioFormat targetFormat=null;
try {
  AudioInputStream in=null;
    MpegAudioFileReader mp=new MpegAudioFileReader();
    in=mp.getAudioInputStream(new URL(f));
  AudioFormat baseFormat=in.getFormat();
targetFormat=new AudioFormat(
          AudioFormat.Encoding.PCM_SIGNED,
          baseFormat.getSampleRate(),
          16,
          baseFormat.getChannels(),
          baseFormat.getChannels() * 2,
          baseFormat.getSampleRate(),
          false);
      audioInputStream=AudioSystem.getAudioInputStream(targetFormat, in);
}
catch(Exception ue) { System.out.println("\nUnsupported Audio"); }
return audioInputStream;
}

public void readURL() {
  int i, j, k=0, l, basicU=1024;
  AudioFormat targetFormat=null;
audioInputStream=readMP3URL("http://c5.rbxcdn.com/2e6d33a5b3b1d8f250c395816ff9f145");
  if(audioInputStream==null) System.out.println("null audiostream");
targetFormat=audioInputStream.getFormat();
byte[] data=new byte[basicU];
DataLine.Info dinfo=new DataLine.Info(SourceDataLine.class, targetFormat);
SourceDataLine line=null;
  try {
    line=(SourceDataLine)AudioSystem.getLine(dinfo);
  if(line!=null) {
    line.open(targetFormat);
    line.start();
      while((k=audioInputStream.read(data, 0, data.length))!=-1) {
      line.write(data, 0, k);
    }
    line.stop();
    line.close();
  }
}
catch(Exception ex) { ex.printStackTrace(); System.out.println("audio problem "+ex); }
}