如何使用 java 从 .pls 文件流式传输 url?
How to stream url from .pls file with java?
我想用 Java 流式传输广播,我的方法是下载播放列表文件 (.pls),然后提取同一文件中给定的 url 之一,最后用 [= 流式传输它24=]。但是,我似乎找不到办法做到这一点。我尝试使用 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 文件是更好的方法吗?可以吗?
您正在连接到 Icecast 服务器,而不是 Web 服务器。 address/port 不是发回 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.
您不能使用 URL class 下载您的流,因为它(正确地)拒绝无效的 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 声音无法播放 MP3(没有插件)。 JMF 和 JavaFX 需要一个 URL,而不仅仅是一个 InputStream。
我在 Stack Overflow 上看到很多关于 JLayer, whose Player class 接受 InputStream 的建议。使用它,其余代码是:
Player player = new Player(response);
player.play();
我想用 Java 流式传输广播,我的方法是下载播放列表文件 (.pls),然后提取同一文件中给定的 url 之一,最后用 [= 流式传输它24=]。但是,我似乎找不到办法做到这一点。我尝试使用 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 文件是更好的方法吗?可以吗?
您正在连接到 Icecast 服务器,而不是 Web 服务器。 address/port 不是发回 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.
您不能使用 URL class 下载您的流,因为它(正确地)拒绝无效的 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 声音无法播放 MP3(没有插件)。 JMF 和 JavaFX 需要一个 URL,而不仅仅是一个 InputStream。
我在 Stack Overflow 上看到很多关于 JLayer, whose Player class 接受 InputStream 的建议。使用它,其余代码是:
Player player = new Player(response);
player.play();