Icecast 2:协议描述,使用C#流式传输

我需要编写一个Icecast 2客户端,它能够将来自计算机的音频(mp3文件,声卡录音等)传输到服务器。 我决定在C#上写这样一个客户端。

两个问题:

1)了解我可能/应该/必须使用的通用指南(最佳实践,可能是技巧)非常有用,以便在C#中无缝地处理流式音频(当然是通过网络流式传输)。 一些关于TCP / IP流通用的一般技术文档,特别是ICY,关于应用程序整体架构的建议和注释将非常受欢迎。

2)是否有关于Icecast 2流媒体协议的良好文档? 我无法在Icecast的官方网站上找到这些文档。 我不想直接从它的源代码中提取协议描述。 如果协议真的很简单,那么有人可以在这里提供它的摘要吗?

据我所知,在Icecast源代码之外的任何地方都没有协议规范。 这是我从数据包嗅探中发现的:

音频流

该协议类似于HTTP。 源客户端将连接到服务器,使用mountpoint发出请求,并传递一些包含有关流的信息的标头:

SOURCE /mp3test ICE/1.0 content-type: audio/mpeg Authorization: Basic c291cmNlOmhhY2ttZQ== ice-name: This is my server name ice-url: http://www.google.com ice-genre: Rock ice-bitrate: 128 ice-private: 0 ice-public: 1 ice-description: This is my server description ice-audio-info: ice-samplerate=44100;ice-bitrate=128;ice-channels=2 

如果一切正常,服务器响应:

 HTTP/1.0 200 OK 

然后源客户端继续发送二进制流数据。 请注意,似乎某些编码器甚至不等待服务器在开始发送流数据之前以200 OK响应。 只是标题,空行,然后流数据。

元数据

使用带外HTTP请求发送元数据。 源客户端发送:

 GET /admin/metadata?pass=hackme&mode=updinfo&mount=/mp3test&song=Even%20more%20meta%21%21 HTTP/1.0 Authorization: Basic c291cmNlOmhhY2ttZQ== User-Agent: (Mozilla Compatible) 

服务器响应:

 HTTP/1.0 200 OK Content-Type: text/xml Content-Length: 113  Metadata update successful1 

另请注意,音频流和元数据请求都在同一端口上发送。 与SHOUTcast不同,这是运行服务器的基本端口。

尽管这个问题很老,我还是要在这里发表评论。

Icecast符合HTTP标准。 对于侦听器端(简单和简单的HTTP1.0, RFC 1945 )来说总是如此,从2.4.0开始,对于源客户端也是如此。

要实现源客户端,它是符合HTTP 1.1又称RFC2616的PUT请求。 某些选项可以通过HTTP标头设置,有关详细信息,请参阅当前的Icecast文档。

如果你发送一种支持的容器格式:Ogg或WebM(技术上是EBML),那么这就是你需要知道的。 为清楚起见,这至少涵盖了Opus,Vorbis,Theora和VP8编解码器。

请注意,虽然通常工作正常,但从技术上讲,其他格式不受支持。 在这种情况下,Icecast仅通过流而不进行任何处理。

如果您需要帮助或有其他问题,那么官方邮件列表和IRC频道是正确的选择。

很久以前看过Icecast2:我能找到的最好的参考是http://forums.radiotoolbox.com/viewtopic.php?t=74链接(我应该打印出来,带我永远找出合适的谷歌法术再次施放到表面)。 它似乎涵盖了服务器和服务器到客户端的源。

关于其准确程度的问题仍然存在:在其他事情消耗之前,我已经完成了Android实现的一半,而且我不记得我的实现与VLC / Winamp之间的沟通有什么问题,但老实说它是我能找到最接近规格的东西。

我所知道的最好的描述是: https : //gist.github.com/ePirat/adc3b8ba00d85b7e3870

@ePirat是xpiph / icecast核心提交者。