我正在尝试读取 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 共享位置。