我如何从互联网上读取音频流(例如http://70.36.96.24:13384/;stream.mp3
)并使用Scala语言将其内容保存到我的本地磁盘?
我试过这样做:
val stream = new URL("http://70.36.96.24:13384/stream.mp3").openStream()
但它提出了这个例外:
java.io.IOException: Invalid Http response
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1342)
at java.net.URL.openStream(URL.java:1037)
at .<init>(<console>:15)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
...
相同的命令适用于其他流式网址:例如
http://174-123-32-173.webnow.net.br/98fm.mp3
更新:此代码适用于Linux,但不适用于Mac。有人知道原因吗?
UPDATE2:实际上这段代码适用于Java 6,但不适用于Java7。操作系统无关紧要。
答案 0 :(得分:3)
您的代码无效,因为服务器未发送有效的HTTP响应。注意发送 HTTP请求,等待响应... 200没有标题,假设HTTP / 0.9
$ wget -O- "http://70.36.96.24:13384/;stream.mp3"
--2014-01-20 17:09:12-- http://70.36.96.24:13384/;stream.mp3
Connecting to 70.36.96.24:13384... connected.
HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9
Length: unspecified
Saving to: `STDOUT'
[<=> ] 0 --.-K/s ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-name:Radio Brasileirissima
icy-genre:Musica Brasileira
icy-url:http://radiobrasileirissima.com.br
content-type:audio/mpeg
icy-pub:0
icy-br:64
....BINARY CONTENT SKIPPED....
您仍然可以通过跳过前几行直到字符序列\r\n\r\n
,其中icy-br:64
结束,并开始实际的AUDIO内容来读取数据。为此你可以创建一个Socket,连接到它并发送一个GET请求到`/ ;stream.mp3'并读取数据:
val timeout = 2000
val host = "70.36.96.24"
val port = 13384
val socket = new Socket
val endPoint = new InetSocketAddress(host, port)
socket.connect(endPoint, timeout);
// Here you send the GET request and read back the response.
// Every time you read the response, you have to skip
// the first few bytes until `\r\n\r\n`
<强> EDIT1 强>
注意:您的GET请求必须包含额外的换行符才能成为HTTP请求
GET /;stream.mp3 HTTP/1.1
以下是同一网址上的工作示例:
def socketurl = {
val timeout = 2000
val host = "70.36.96.24"
val port = 13384
val socket = new Socket
val endPoint = new InetSocketAddress(host, port)
socket.connect(endPoint, timeout);
val (in, out) = (socket.getInputStream(), socket.getOutputStream())
val httpRequest = "GET /;stream.mp3 HTTP/1.1\r\n\r\n"
val command = httpRequest.getBytes()
println(httpRequest)
out.write(command)
var buf = Vector(0, 0, 0, 0)
var c = in.read()
var cont = true
while (c != -1 && cont) {
buf = buf.drop(1) :+ c
print(c.toChar)
if (buf(0) == '\r' && buf(1) == '\n' && buf(2) == '\r' && buf(3) == '\n') {
cont = false
println("Its a match")
}
c = in.read()
}
while (c != -1) {
// keep buffering the data from here on!
}
}
// call the method
socketurl