我需要编写一个Icecast 2客户端,该客户端将能够将音频从计算机(mp3文件,声卡录音等)流传输到服务器。我决定在C#上编写这样的客户端。
两个问题:
1)知道我可能/应该/必须使用的,与C#中的流音频(当然是通过网络流)无缝协作的通用准则(最佳实践,也许是技巧)将非常有用。我们将非常感谢一些通用的技术文档,特别是有关通过TCP / IP进行流式传输(尤其是ICY),有关应用程序整体体系结构的建议和注释。
2)是否有关于Icecast 2流协议的良好文档?我在Icecast的官方网站上找不到这些文档。我不想直接从其源代码中提取协议描述。如果该协议确实非常简单和整洁,那么有人可以在此处提供它的摘要吗?
据我所知,在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在开始发送流数据之前甚至没有等待服务器响应。只是标题,空行,然后流数据。
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不同,这是服务器运行所在的基本端口。