Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的SHOUTcast服务器_Java_Shoutcast_Icecast_Internet Radio - Fatal编程技术网

Java中的SHOUTcast服务器

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\ 然后开始流式传输文件,然而,当我向客户发送冰冷的响应时,声音开始变得有点起伏和刺耳,有时播放得有点快。有时它会同时播放播放列表中所有歌曲的小块片段,但如果我断开客户端并再次连接,它会正常播放,在这种情况下,会有一点起伏和吱吱作响。我试着连接到

我正在用Java制作shoutcast服务器,我遇到了一个困难。如果我向客户端(VLC/WINAMP)发送HTTP响应,我的服务器可以很好地传输数据:

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配合得非常好,我对它有什么地方做错了吗

我知道代码看起来有点凌乱,可能会更好,但这只是一个测试。我也发送这个常量字符串作为测试,看看它是否有用。计划是如果成功的话就把它做好

感谢您的帮助

我的信息是从

编辑:

这就是我决定何时发送字节的方式(此代码处于while(true)循环中)

将24KB的歌曲读入缓冲区,然后写入输出流。我删除了编写元数据的代码位,但我是在outputStream.write(缓冲区)之前编写元数据的


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.