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 - это подходящее место.
Ответ 4
Лучшее описание, которое я знаю, здесь: https://gist.github.com/ePirat/adc3b8ba00d85b7e3870
@ePirat - это компилятор ядра xpiph/icecast.