Icecast 2: описание протокола, потоковая передача на него с помощью C#

Мне нужно написать клиент Icecast 2, который сможет передавать аудио с компьютера (mp3-файлы, запись звуковой карты и т. д.) на сервер. Я решил написать клиент на C#.

два вопроса:

1) будет очень полезно знать общие рекомендации (лучшие практики, возможно, трюки), которые я могу/должен/должен использовать для плавной работы с потоковым аудио (потоковым по сети, Конечно) в C#. Некоторые общие технические документы о потоковой передаче TCP / IP в общем и ICY в частности, советы и замечания по общей архитектуре приложения будут очень оценены.

2) есть ли хорошая документация, касающаяся протокола потоковой передачи Icecast 2? Я не смог найти эти документы на официальном сайте Icecast. Я не хочу извлекать описание протокола непосредственно из исходного кода. Если протокол действительно прост и аккуратен, может ли кто-нибудь предоставить его резюме прямо здесь?

4 ответов


насколько я знаю, нигде нет спецификации протокола, за пределами исходного кода 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, это базовый порт, на котором работает сервер.


Я собираюсь прокомментировать здесь, несмотря на то, что этот вопрос довольно старый.

Icecast является http-совместимым. Это всегда было так для стороны слушателя (простой и простой HTTP1.0,RFC 1945), начиная с 2.4.0, это также верно для исходной клиентской стороны.

для реализации исходного клиента это запрос PUT в соответствии с HTTP 1.1 aka адресу rfc2616. Некоторые параметры можно установить через заголовки HTTP, для деталей пожалуйста см. течение Для icecast документации.

Если вы отправляете один из поддерживаемых форматов контейнеров: Ogg или WebM (технически EBML), то это все, что вам нужно знать. Чтобы было понятно, что это охватывает кодеки leastOpus, Vorbis, Theora и VP8.

обратите внимание, что, хотя обычно работает нормально, другие форматы технически не поддерживаются. Icecast только проходит через поток без какой-либо обработки в таком случае.

Если вам нужна помощь или возникнут вопросы, то официальный списки рассылки и канал IRC-это правильное место для перехода.


посмотрел на Icecast2 очень давно: лучшая ссылка, которую я мог найти, была в http://forums.radiotoolbox.com/viewtopic.php?t=74 Ссылка (я должен распечатать это, взял меня навсегда, чтобы выяснить правильное заклинание Google, чтобы бросить на поверхность это снова). По-видимому, он охватывает источник для сервера и сервер для клиента.

остаются вопросы о том, насколько это точно: я получил около половины реализации Android, прежде чем другие вещи потребляли меня, и я не могу совсем помните, что было не так с коммуникацией между моей реализацией этого и VLC / Winamp, но, честно говоря, это было самое близкое, что я мог найти к спецификации.


лучшее описание, которое я знаю, здесь:https://gist.github.com/ePirat/adc3b8ba00d85b7e3870

@ePirat является xpiph / icecast core committer.