我想用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文件?可以吗?
答案 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();