Icecast 2: 协议描述,使用 C# 进行流媒体传输

18

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

两个问题:

1)了解在C#中无缝处理流式音频所需的常见指南(最佳实践、技巧等)将会非常有用,特别是关于TCP/IP和ICY的流媒体技术文档,以及应用程序整体架构的建议和注意事项。

2)是否有关于Icecast 2流媒体协议的良好文档?我在Icecast的官方网站上找不到这些文档。如果协议确实简单明了,能否在此提供其摘要?


你是如何打开TCP连接的?http://stackoverflow.com/questions/13203154/open-socket-connection-with-icecast-server-on-ios - JonathanC
你需要制作IceCast客户端吗?你能展示一下吗?请帮忙。 - zerpico
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不同的是,这是服务器运行的基本端口。


3
@JonathanC,这里没有固定的格式...只需发送原始编码的音频数据。你甚至可以从流中的任意位置开始。 - Brad
我猜我的意思是:Icecast期望使用什么协议来处理这个原始二进制数据? - JonathanC
@JonathanC,没有什么是可以预料的。一旦连接后发送了头文件,您只需要发送来自编码器的数据输出即可。头文件只会发送一次...而不是每个块都要发送。服务器并不太关心格式。它将缓冲数据并按原样发送给客户端。 - Brad
我明白了。谢谢您的回答。因此,块是以简单的HTTP正文发送的,对吗?一开始我还以为我需要打开套接字连接之类的东西。因此,我发送以下HTTP请求,其中正文为原始二进制数据: “SOURCE /mp3test ICE/1.0 content-type: audio/mpeg”这样正确吗? - JonathanC
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/18880/discussion-between-brad-and-jonathanc - Brad
显示剩余6条评论

7

尽管这个问题已经很老了,但我还是想在这里留下我的评论。

Icecast符合HTTP协议。对于听众端来说,这一直是如此(简单的HTTP1.0,遵循RFC 1945),而从2.4.0版本开始,源客户端也符合这一点。

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

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

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

如果您需要帮助或有进一步的问题,请到官方邮件列表和IRC频道寻求答案。


嗨!很高兴看到Icecast现在支持简单的HTTP PUT请求。你有没有想过2.4版本何时会被认为是稳定版?还有,你有这个文档的链接吗?我只能找到发布公告。 - Brad
Icecast 2.4.0于2014年5月6日发布。目前的版本是2.4.1,在撰写本文时已经修复了许多错误。 - TBR

4
很久以前看过Icecast2:最好的参考资料我在http://forums.radiotoolbox.com/viewtopic.php?t=74找到的链接(我应该打印出来,花了我很长时间才弄清楚正确的谷歌拼写,才能再次找到)。它似乎涵盖了源到服务器和服务器到客户端。
仍然有一些问题需要解决:在其他事情占据我的时间之前,我进行了大约一半的Android实现,但我不太记得我的实现与VLC / Winamp之间的通信有什么问题,但老实说,这是我能找到的最接近规范的东西。

1
请注意,这是针对SHOUTcast源协议的。Icecast一次只支持一个使用此协议的源客户端。Icecast有一个单独的源协议,基本上是HTTP。 - Brad
有规范的网址吗?很想拿到它。 - Femi
你和我一样都没找到相关文档,看来唯一的文档在源代码中。我一直在通过抓取数据包来解决问题,这并不复杂。你可以在我的问题的第一个代码块中看到一般的流程:http://stackoverflow.com/questions/9970679/keeping-socket-open-after-http-request-response-to-node-js-server - Brad

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接