Icecast 2: описание протокола, потоковая передача на него с использованием C # - PullRequest
15 голосов
/ 07 марта 2011

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

Два вопроса:

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

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

Ответы [ 4 ]

28 голосов
/ 03 апреля 2012

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

6 голосов
/ 03 августа 2013

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

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

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

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

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

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

4 голосов
/ 28 апреля 2011

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

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

1 голос
/ 08 сентября 2017

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

@ ePirat - основной коммиттер xpiph / icecast.

...