Icecast 2: описание протокола, потоковое воспроизведение с использованием С#

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

Два вопроса:

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Для реализации исходного клиента это запрос PUT в соответствии с HTTP 1.1 aka RFC2616. Некоторые параметры могут быть установлены через HTTP-заголовки, подробности см. В текущей документации Icecast.

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

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

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