Формат mp3 был разработан для потоковой передачи, что делает некоторые вещи проще, чем вы могли ожидать.По сути, данные представляют собой поток звуковых кадров со встроенными граничными маркерами, а не заголовок файла, за которым следуют необработанные данные.Это означает, что, как только клиент ожидает получения аудиоданных, вы можете просто начать отправку его байтов из любой точки существующего источника MP3, будь то живой или файл, и клиент будет синхронизироваться до следующего найденного кадра иначать воспроизведение аудио.Yay!
Конечно, вам придется дать клиентам способ установить соединение.Фактическим стандартом является протокол SHOUTcast (ICY).Это очень похоже на HTTP, но поля статуса и заголовка достаточно разные, поэтому они не совместимы напрямую со встроенными библиотеками http-сервера Python.Возможно, вы сможете заставить эти библиотеки выполнить часть работы за вас, но их документированных интерфейсов будет недостаточно, чтобы это сделать;вам нужно прочитать их код, чтобы понять, как заставить их говорить на SHOUTcast.
Вот несколько ссылок, с которых можно начать:
http://forums.winamp.com/showthread.php?threadid=70403
http://forums.radiotoolbox.com/viewtopic.php?t=74
http://www.smackfu.com/stuff/programming/shoutcast.html
http://en.wikipedia.org/wiki/Shoutcast
Я предлагаю начать с одного mp3-файла в качестве источника данных, настроить соединение и воспроизведение соединения клиент-сервер, а такжезатем перейдем к таким проблемам, как живые источники, множественные скорости кодирования, метаданные внутри полосы и списки воспроизведения.
Списки воспроизведения, как правило, представляют собой файлы .pls или .m3u и, по сути, просто статические текстовые файлы, указывающие на URL-адрес дляваш прямой эфирОни не сложны и даже не являются строго необходимыми, поскольку многие (большинство?) Клиенты потоковой передачи mp3 будут принимать URL-адреса прямой трансляции вообще без списка воспроизведения.
Что касается архитектуры, поле довольно широко открыто.У вас есть столько же вариантов, сколько для HTTP-серверовХодовой?Рабочие процессы?Событие управляемое?Тебе решать.Для меня более интересным является вопрос о том, как поделиться данными из одного входного потока (вещателя) с сетевыми обработчиками, обслуживающими несколько выходных потоков (проигрыватели).Чтобы избежать осложнений IPC и синхронизации, я бы, вероятно, начал с однопоточного проекта, управляемого событиями.В Python 2 библиотека, подобная gevent , даст вам очень хорошую производительность ввода-вывода , в то же время позволяя структурировать ваш код очень понятным способом.В Python 3 я бы предпочел asyncio сопрограммы.