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

7
我想要获取代码中提供的URL上的声音文件并播放(它是以 mp3 格式保存的)。我查看了一些与此问题相关的 Stack Overflow 问题,他们都建议获取 mp3plugin.jar,所以我就这样做了。
在 Eclipse 中,我将其作为外部 jar 添加到了 Build Path 中(因为它位于我的 Downloads 文件夹中,不确定是否最好放在那里)。我再次运行它,但仍然出现以下错误:

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at 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
你曾经检查过你正在阅读的内容吗?你可能把一个HTML错误页面当作MP3来处理。 - Marged
当我在Chrome中输入了那个URL时,在网络选项卡中看到了2行。它可能需要一些更多的头信息才能给你实际的流。 - Gavriel
我该如何获取其中的媒体部分?(它说文档和媒体)。我听说 jSoup 可以帮助处理 Java 中的一些 HTML 处理。 - Encoded Lua
音频在<source>标签中。我怎样解析它并将音频文件提取出来? - Encoded Lua
请注意,除非服务器提供可重定位的输入流,否则它将无法与Java Sound一起使用(无论是否使用MP3服务提供程序接口(mp3plugin.jar)。 - Andrew Thompson
1个回答

2
您需要获取http://www.javazoom.net/mp3spi/docs/doc1.9.4/javazoom/spi/mpeg/sampled/file/MpegAudioFileReader.html,下载jar包。我的类路径为:
.;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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接