2

我正在尝试读取 Shoutcast 流,然后使用 MediaStreamSource 播放它。这是节省了我很多时间的优秀开源项目。经过一点点修改,我能够听到完美的声音。但问题是我得到了周期性的昙花一现/打嗝的噪音。

知道如何阻止这种噪音。我认为它可能是 Shoutcast 在间隔发送一些元数据,但不知道如何阻止它。试过request.Headers["Icy-MetaData"] = "0"; 但它也不能解决我的问题。任何帮助将不胜感激。

Edit1: 我做了更多调查。我阅读了我的流数据 2-3 分钟,发现该流中有很多“零”字节。这是'0'字节的索引列表

92 247 359 1208 1904 2037 2227 2397 2536 2694 2740 2863 2952 3048 3110 3689 3994 4027 4098 4218 4730 4830 4943 5029 5115 5248 5315 5358 5666 6084 6375 6873 6920 7441 7660 7700 7756 8174 8254 8614 9010 9018 9025 9039 9541 9846.... .

是因为 httpwebrequest 下载速度慢/下载失败还是 Shoutcast 本身发送了那些零字节?这个“0”字节也会导致打嗝噪音吗?

Edit2: 这是几行代码,说明了我如何从广播中获得响应

        HttpWebRequest request = result.AsyncState as HttpWebRequest;
        HttpWebResponse response = request.EndGetResponse(result) as HttpWebResponse;     
        r = response.GetResponseStream();
        ShoutcastHeader(r);

这是我的 ShoutcastHeader 方法定义:

        StreamReader headerReader = new StreamReader(r);
        bool headerIsDone = false;
        while (!headerIsDone)
        {
            string headerLine = headerReader.ReadLine();

            if (headerLine.StartsWith("icy-name:"))
            {
                StationName = headerLine.Substring(9);
            }
            else if (headerLine.StartsWith("icy-genre:"))
            {
                Genre = headerLine.Substring(10);
            }
            else if (headerLine.StartsWith("icy-br:"))
            {
                BitRate = short.Parse(headerLine.Substring(7));
            }
            else if (headerLine.StartsWith("icy-metaint:"))
            {
                MetaInt = int.Parse(headerLine.Substring(12)) * 1111084;
                MetadataAvailable = true;
            }
            else if (headerLine.Equals(""))
                headerIsDone = true;
        }

这是 headerReader 中的响应

ICY 200 OK icy-notice1:
此流需要Winamp
icy-notice2:SHOUTcast 分布式网络音频服务器/Linux v1.9.93atdn
icy-name:Bollywood & Beyond - Radio NRI 24/7 icy-genre:Indian Hindi Tamil Telugu Malayalam Desi icy -url:http://www.radionri.com 内容类型:audio/mpeg icy-pub:1 icy-br:128

我还把流字节放在我的 skydrive 共享位置

4

1 回答 1

0

基于这个线程,看起来打嗝是定期重新发送的标头信息。ShoutStreamSource 项目也存在引用此问题的问题:

“当前的实现不会在第一个被解析后丢弃 mp3headers。这会导致来自流的声音中断,并将在不久的将来修复。”

然而,在给出这个答案时,该项目似乎被搁置了。希望您或其他人可以添加此功能。至少知道问题所在应该有助于解决问题。

于 2012-02-06T18:16:17.227 回答