El formato mp3 fue diseñado para la transmisión, lo que hace que algunas cosas sean más simples de lo que podría haber esperado. La información es esencialmente una secuencia de audio frames con marcadores de límites incorporados, en lugar de un encabezado de archivo seguido de datos brutos. Esto significa que una vez que un cliente espera recibir datos de audio, puede comenzar a enviar bytes desde cualquier punto de una fuente mp3 existente, ya sea en vivo o en un archivo, y el cliente sincronizará hasta el siguiente cuadro que encuentre y comienza a reproducir audio ¡Hurra!
Por supuesto, tendrá que dar a los clientes una forma de configurar la conexión. El estándar de facto es el protocolo SHOUTcast (ICY). Esto es muy parecido a HTTP, pero con campos de estado y encabezado lo suficientemente diferentes como para que no sea directamente compatible con las bibliotecas de servidor http integradas de Python.Es posible que pueda hacer que esas bibliotecas hagan parte del trabajo por usted, pero sus interfaces documentadas no serán suficientes para hacerlo; Tendrás que leer su código para entender cómo hacer que hablen SHOUTcast.
Éstos son algunos enlaces para empezar:
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
Sugiero comenzar con un único archivo MP3 como origen de datos , obteniendo la configuración de conexión cliente-servidor yp layback trabajando, y luego pasando a temas como fuentes en vivo, múltiples tasas de bits de codificación, metadatos en banda y listas de reproducción.
Las listas de reproducción son generalmente archivos .pls o .m3u, y esencialmente solo archivos de texto estáticos que apuntan a la URL de su transmisión en vivo. No son difíciles y ni siquiera son estrictamente necesarios, ya que muchos (¿la mayoría?) Clientes de transmisión de mp3 aceptarán una URL de transmisión en vivo sin lista de reproducción en absoluto.
En cuanto a la arquitectura, el campo está bastante abierto. Tiene tantas opciones como hay para servidores HTTP. ¿Roscado? Procesos de trabajo? ¿Evento conducido? Tu decides. Para mí, la pregunta más interesante es cómo compartir los datos de una sola transmisión de entrada (la emisora) con los manejadores de red que sirven múltiples flujos de salida (los reproductores). Para evitar las complicaciones de IPC y sincronización, probablemente comenzaría con un diseño basado en eventos de un único subproceso. En python 2, una biblioteca como gevent le dará very good I/O performance y le permitirá estructurar su código de una manera muy comprensible. En python 3, preferiría asyncio coroutines.
¿Desea que cosas como VLC se puedan vincular a la transmisión o simplemente codifique su propio cliente? – thenoviceoof
@thenoviceoof - gran pregunta, sí, me gustaría que los clientes "convencionales" puedan conectarse. iTunes, Winamp, VLC, etc. –
¿Está comprimiendo el audio en tiempo real o reproduciendo archivos MP3 pre-creados? – rakslice