17

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

两个问题:

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

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

4

4 回答 4

31

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

音频流

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

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

<?xml version="1.0"?>
<iceresponse><message>Metadata update successful</message><return>1</return></iceresponse>

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

于 2012-04-02T23:39:59.077 回答
7

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

Icecast 是 HTTP 兼容的。侦听器端总是如此(简单的 HTTP1.0,RFC 1945),从 2.4.0 开始,源客户端也是如此。

要实现源客户端,它是一个符合 HTTP 1.1 aka RFC2616的 PUT 请求。一些选项可以通过 HTTP 头设置,详细信息请参考当前的 Icecast 文档。

如果您发送一种受支持的容器格式:Ogg 或 WebM(技术上是 EBML),那么这就是您需要知道的全部内容。明确地说,这至少涵盖了 Opus、Vorbis、Theora 和 VP8 编解码器。

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

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

于 2013-08-03T16:16:18.850 回答
4

很久以前看过 Icecast2:我能找到的最佳参考是http://forums.radiotoolbox.com/viewtopic.php?t=74链接(我应该把它打印出来,我花了很长时间才弄清楚正确的谷歌再次施法以使其浮出水面)。它似乎涵盖了源到服务器和服务器到客户端。

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

于 2011-04-28T16:18:14.280 回答
1

我知道的最好的描述在这里:https ://gist.github.com/ePirat/adc3b8ba00d85b7e3870

@ePirat is xpiph/icecast core committer.

于 2017-09-08T09:15:57.513 回答