我需要编写一个Icecast 2客户端,能够从计算机(MP3文件、声卡录音等)向服务器流式传输音频。我决定使用C#编写这样的客户端。
两个问题:
1)了解在C#中无缝处理流式音频所需的常见指南(最佳实践、技巧等)将会非常有用,特别是关于TCP/IP和ICY的流媒体技术文档,以及应用程序整体架构的建议和注意事项。
2)是否有关于Icecast 2流媒体协议的良好文档?我在Icecast的官方网站上找不到这些文档。如果协议确实简单明了,能否在此提供其摘要?
我需要编写一个Icecast 2客户端,能够从计算机(MP3文件、声卡录音等)向服务器流式传输音频。我决定使用C#编写这样的客户端。
两个问题:
1)了解在C#中无缝处理流式音频所需的常见指南(最佳实践、技巧等)将会非常有用,特别是关于TCP/IP和ICY的流媒体技术文档,以及应用程序整体架构的建议和注意事项。
2)是否有关于Icecast 2流媒体协议的良好文档?我在Icecast的官方网站上找不到这些文档。如果协议确实简单明了,能否在此提供其摘要?
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不同的是,这是服务器运行的基本端口。
尽管这个问题已经很老了,但我还是想在这里留下我的评论。
Icecast符合HTTP协议。对于听众端来说,这一直是如此(简单的HTTP1.0,遵循RFC 1945),而从2.4.0版本开始,源客户端也符合这一点。
要实现源客户端,它需要符合HTTP 1.1或RFC2616。一些选项可以通过HTTP头设置,有关详细信息,请参阅当前的Icecast文档。
如果您发送了其中一个支持的容器格式:Ogg或WebM(技术上是EBML),那么这就是您需要知道的全部内容。为了明确起见,这至少涵盖了Opus、Vorbis、Theora和VP8编解码器。
请注意,虽然通常情况下可以正常工作,但其他格式在技术上并不受支持。在这种情况下,Icecast仅通过流,而不进行任何处理。
如果您需要帮助或有进一步的问题,请到官方邮件列表和IRC频道寻求答案。
我知道的最好的描述在这里:https://gist.github.com/ePirat/adc3b8ba00d85b7e3870
@ePirat是xpiph/icecast的核心贡献者。