如何使用java从.pls文件中流式传输网址?

时间:2015-03-12 00:45:09

标签: java streaming radio

我想用Java流式传输一个广播,我的方法是下载播放列表文件(.pls),然后提取同一个文件中给出的一个网址,最后用java流式传输。但是,我似乎无法找到办法。我尝试使用JMF,但每次运行代码时都会得到java.io.IOException: Invalid Http response

以下是我的尝试:

Player player = Manager.createPlayer(new URL("http://50.7.98.106:8398"));
player.start();

.pls文件:

[playlist]
NumberOfEntries=1
File1=http://50.7.98.106:8398/

在上面的代码中,我手动设置了URL,仅用于测试,但是我已经完成了.pls下载代码并且它正在工作,并且从此我提出另一个问题,这是一个更好的方法只是简单地在本地播放.pls文件?可以吗?

1 个答案:

答案 0 :(得分:1)

您正在连接到Icecast服务器,而不是Web服务器。该地址/端口没有发回HTTP响应,它正在发回Icecast响应。

The HTTP specification states that the response line must start with the HTTP version of the response. Icecast响应不会这样做,因此它们不是有效的HTTP响应。

我对实现Icecast客户端一无所知,但我怀疑这样的客户端将.pls文件中的http: URL解释为主机和端口规范,而不是真正的HTTP URL。 / p>

您不能使用URL类来下载流,因为它(正确地)拒绝无效的HTTP响应,因此您需要自己读取数据。幸运的是,这部分相当简单:

Socket connection = new Socket("50.7.98.106", 8398);

String request = "GET / HTTP/1.1\n\n";
OutputStream out = connection.getOutputStream();
out.write(request.getBytes(StandardCharsets.US_ASCII));
out.flush();

InputStream response = connection.getInputStream();

// Skip headers until we read a blank line.
int lineLength;
do {
    lineLength = 0;
    for (int b = response.read();
         b >= 0 && b != '\n';
         b = response.read()) {
        lineLength++;
    }
} while (lineLength > 0);

// rest of stream is audio data.
// ...

您仍然需要找一些播放音频的内容。 Java Sound无法播放MP3(没有插件)。 JMF和JavaFX需要一个URL,而不仅仅是一个InputStream。

我看到很多关于JLayer的Stack Overflow的建议,Player class接受了一个InputStream。使用它,其余代码是:

Player player = new Player(response);
player.play();