帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:Shoutcast    

介绍

本文介绍了一个用于接收Shoutcast流。 对于某些 background 信息,请查看这里简短协议描述,或者访问 Shoutcast站点。

背景

在我最后一个项目中,我必须接收。捕获和播放Shoutcast流。 我找了一些准备使用实现,但没有找到任何东西,所以我决定写自己的。

使用代码

因为它是相对简单的协议,代码也很简单,但是它应该做的就是。 : )

为了更好地互操作到其他类,我从抽象的派生,因此其他能够处理流的类也可以处理我的流。

///<spanclass="code-SummaryComment"><summary></span>/// Creates a new ShoutcastStream and connects to the specified Url///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="url">Url of the Shoutcast stream</param></span>public ShoutcastStream(string url)
{
 HttpWebResponse response;
 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
 request.Headers.Clear();
 request.Headers.Add("Icy-MetaData", "1");
 request.KeepAlive = false;
 request.UserAgent = "VLC media player";
 response = (HttpWebResponse)request.GetResponse();
 metaInt = int.Parse(response.Headers["Icy-MetaInt"]);
 receivedBytes = 0;
 netStream = response.GetResponseStream();
 connected = true;
}

在构造器中,建立连接。 因此,我们必须将一个新的字段放入到HTTP请求中,Icy-MetaData:1。 我们还将 UserAgent 设置为"。vlc媒体播放器"( 也可以使用 WinAmp 等等 ),因为某些Shoutcast服务器与 UserAgent 服务器的行为不同。

得到响应后,我们读取 Icy-MetaInt 值。 这是显示服务器发送元信息块之前接收到多少数据字节的值。

///<spanclass="code-SummaryComment"><summary></span>/// Reads data from the ShoutcastStream.///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="buffer">An array of bytes to store</span>/// the received data from the ShoutcastStream.<spanclass="code-SummaryComment"></param></span>///<spanclass="code-SummaryComment"><paramname="offset">The location in the buffer</span>/// to begin storing the data to.<spanclass="code-SummaryComment"></param></span>///<spanclass="code-SummaryComment"><paramname="count">The number of bytes</span>/// to read from the ShoutcastStream.<spanclass="code-SummaryComment"></param></span>///<spanclass="code-SummaryComment"><returns>The number of bytes read from the ShoutcastStream.</returns></span>publicoverrideint Read(byte[] buffer, int offset, int count)
{
 try {
 if (receivedBytes == metaInt)
 {
 int metaLen = netStream.ReadByte();
 if (metaLen >0)
 {
 byte[] metaInfo = new byte[metaLen * 16];
 int len = 0;
 while ((len += netStream.Read(metaInfo, len, 
 metaInfo.Length - len)) < metaInfo.Length) ;
 ParseMetaInfo(metaInfo);
 }
 receivedBytes = 0;
 }
 int bytesLeft = ((metaInt - receivedBytes) > count)? 
 count : (metaInt - receivedBytes);
 int result = netStream.Read(buffer, offset, bytesLeft);
 receivedBytes += result;
 return result;
 }
 catch (Exception e)
 {
 connected = false;
 Console.WriteLine(e.Message);
 return -1;
 }
}

如果请求的字节数是 LESS 比下一元信息 block 之前的剩余字节数,那么我们将读取所请求的字节数。 但是,如果在用户请求的下一个元信息 block 之前有 LESS 字节,我们将只读取剩余的字节并返回。 当用户下次调用 Read 时,首先填写 from block,然后继续读取流中的媒体数据。

每次收到元信息 block 时,将提取当前流标题。 如果流标题发生更改,则激发相应事件。

便笺

在应用程序中使用这里方法之前,你必须按以下方式扩展你的App.config:

<configuration><system.net><settings><httpWebRequestuseUnsafeHeaderParsing="true"/></settings></system.net></configuration>

Points of Interest

如果有人对使用托管DirectSound播放Shoutcast流感兴趣( 纯. NET), 请求它)。 也许,我将写一篇关于这方面的文章。

历史记录

  • 1.0 - 初始修订版( 10 2007年06月 )


文章标签:  Shoutcast  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语