Java中的SHOUTcast服务器
我正在用Java制作shoutcast服务器,我遇到了一个困难。如果我向客户端(VLC/WINAMP)发送HTTP响应,我的服务器可以很好地传输数据:Java中的SHOUTcast服务器,java,shoutcast,icecast,internet-radio,Java,Shoutcast,Icecast,Internet Radio,我正在用Java制作shoutcast服务器,我遇到了一个困难。如果我向客户端(VLC/WINAMP)发送HTTP响应,我的服务器可以很好地传输数据: HTTP/1.1 200 OK\r\nContent-Type:audio/mpeg\r\n\r\n\ 然后开始流式传输文件,然而,当我向客户发送冰冷的响应时,声音开始变得有点起伏和刺耳,有时播放得有点快。有时它会同时播放播放列表中所有歌曲的小块片段,但如果我断开客户端并再次连接,它会正常播放,在这种情况下,会有一点起伏和吱吱作响。我试着连接到
HTTP/1.1 200 OK\r\nContent-Type:audio/mpeg\r\n\r\n\
然后开始流式传输文件,然而,当我向客户发送冰冷的响应时,声音开始变得有点起伏和刺耳,有时播放得有点快。有时它会同时播放播放列表中所有歌曲的小块片段,但如果我断开客户端并再次连接,它会正常播放,在这种情况下,会有一点起伏和吱吱作响。我试着连接到互联网上的shoutcast服务器,它们看起来完美无缺。(我也在发送24kb的数据块)
这是我冰冷的回答
String respond = "ICY 200 OK\r\n"
+"icy-notice1: <BR> This stream requires"
+ "<a href=\"http://www.videolan.org/\">VLC</a><BR>\r\n"
+ "icy-notice2: Lee Shoutcast<BR>\r\n"
+ "icy-name: Lee's Mix\r\n"
+ "icy-genre: Rock\r\n"
+ "icy-url: http://localhost:9025\r\n"
+ "content-type: audio/mpeg\r\n"
+ "icy-pub: 1\r\n"
+ "icy-metaint: 24576\r\n"
+ "icy-br: 96\r\n\r\n";
Padding方法只是将零添加到字符串的右侧:
public String padding(int numberOfPads)
{
String ret = "";
for(int i = 1; i <= numberOfPads; i++)
{
ret += "0";
}
return ret;
}
然后,我将字符串转换为字节,并将这些头字节写入流,然后写入24kb块,然后写入头,依此类推。这似乎对形势毫无帮助。由于SHOUTcast与ICEcast配合得非常好,我对它有什么地方做错了吗
我知道代码看起来有点凌乱,可能会更好,但这只是一个测试。我也发送这个常量字符串作为测试,看看它是否有用。计划是如果成功的话就把它做好
感谢您的帮助
我的信息是从
VLC和Wiamp确实发送ICE metadata=1。首先,我建议不要模拟SHOUTcast的状态行
ICE 200 OK
。改为使用HTTP/1.0 200 OK。通过这种方式,您将与客户端具有更好的兼容性
现在,正如您所怀疑的,服务器行为不同的原因是元数据。icy metaint
响应头控制元块之间的间隔。您应该仅在客户端请求时插入此标头并返回元数据。客户端必须发送icy metadata:1
以请求元数据。否则,只能发送流数据
您没有说明如何确定何时插入元数据,但我怀疑您遇到了一个常见的误解。发送到客户机的第一个数据应该是流数据,而不是元数据。流数据需要以元间隔响应头指定的增量发送
[24,576 bytes of stream] [metablock] [24,576 bytes of stream] [metablock] etc.
最后,您的元块填充不正确。不要使用文本
0
,使用NUL
字节0x00
我添加了如何确定何时发送编辑问题中的区块。这个元块包含什么?它是否与我以前所做的一样,只使用空字节?我将研究如何使用连续空值填充字符串。谢谢你的帮助,我会做出建议的改变,谢谢
5StreamTitle='The year of the ram';StreamUrl='http://someaddress:9025';000000000000
buffer = new byte[24576];
//read the file into the buffer
bytesRead = song.read(buffer);
//start streaming the file.
outputStream.write(buffer);
[24,576 bytes of stream] [metablock] [24,576 bytes of stream] [metablock] etc.