tag demand astra linux http streaming mp3 debian

demand - HTTP Live Streaming: La pesadilla de Linux



rtmp nginx m3u8 (7)

¿Qué problemas tenías con httpsegmenter? Es un único archivo fuente de C que solo enlaza con algunas bibliotecas proporcionadas por ffmpeg (o libav). Mantengo un ebuild de Gentoo para él, ya que lo uso para la radio de conversación de turno horario. Si estás ejecutando Gentoo, construir es tan simple como esto:

sudo bash -l layman -S layman -a salfter echo media-video/httpsegmenter ~/* >>/etc/portage/package.accept_keywords emerge httpsegmenter exit

En Ubuntu, tenía que asegurarme de que libavutil-dev y libavformat-dev estuvieran instalados, por lo que la compilación se parece a esto:

sudo apt-get install libavutil-dev libavformat-dev git clone https://gitlab.com/salfter/httpsegmenter.git cd httpsegmenter make -f Makefile.txt sudo make -f Makefile.txt install

Una vez que está construido (y una vez que tengo una URL de fuente de audio), el uso es bastante simple: enrollar para transmitir el audio, ffmpeg para transcodificarlo de lo que sea en la fuente (a menudo MP3) a AAC, y segmentar para fragmentarlo:

curl -m 3600 http://invalid.tld/stream | / ffmpeg -i - -acodec libvo_aacenc -ac 1 -ab 32k -f mpegts - 2>/dev/null | / segmenter -i - -d 20 -o ExampleStream -x ExampleStream.m3u8 2>/dev/null

Esto toma una hora de transmisión de audio (debe ser MP3 o AAC, no Flash), lo transcodifica a AAC de 32 kbps mono, y lo descompone para la transmisión HTTP en vivo. Haz que se descargue en un directorio servido por tu servidor web y estarás listo.

Una vez que el programa termina, la conversión a un solo .m4a que se puede servir como un podcast también es simple:

cat `ls -rt ExampleStream-*.ts` | / ffmpeg -i - -acodec copy -absf aac_adtstoasc ExampleStream.m4a 2>/dev/null

Estoy trabajando en una aplicación de música VOD en iPhone, y gracias a las directrices de Apple, tengo que ejecutar un HTTP Live Streaming para ser aceptado en la AppStore. Pero, dado que a Apple no le importa el 98% de los servidores de la tierra, no proporcionan sus tan mágicas herramientas de transmisión en vivo HTTP para sistemas basados ​​en Linux. Y a partir de este punto, comienza la pesadilla.

Mi objetivo es simple: tomar un MP3, segmentarlo y generar un archivo de índice .m3u8 simple. Busqué en Google "HTTP Live Streaming Linux" y "¡Genial! ¡Muchas personas ya lo han hecho"!

Primero, visité el (tan famoso) post de Carson McDonald . Resultado: el svn segmentate.c era viejo, con errores y una pesadilla para compilar (¡Nadie en este mundo puede precisar qué versión de ffmpeg está usando!). Luego me encontré con el repositorio git de Carson , pero muy mal, hay muchas cosas molestas de rubí y live_segmenter.c no puede llevar archivos mp3.

Entonces busqué más profundamente. Encontré este tema de stackoverflow , y es exactamente lo que quiero hacer. Así que he seguido los consejos de juuni para usar este script (httpsegmenter) . Resultado: Imposible compilar cualquier cosa, 2 días de trabajos y finalmente logré compilarlo (ffmpeg 8.1 w / httpsegmenter rev17). Y no, este no es un buen script, toma archivos mp3, pero los archivos ts se generan y el archivo de índice no puede ser leído por un jugador.

Luego, el autor del post krisbulman, llegó con una solución e incluso dio una versión parcheada de m3u8-segmenter por su cuenta ( git repo ). Lo pruebo: no compila, no hace nada. Así que tomé la versión original de johnf https://github.com/johnf/m3u8-segmenter . Me las arreglé para compilar y milagroso funciona (no realmente). Utilicé esta línea de comando (ffmpeg 0.8.1):

ffmpeg -er 4 -i music.mp3 -f mpegts -acodec libmp3lame -ar 44100 -ab 128k -vn - | m3u8-segmenter -i - -d 10 -p outputdir/prefix -m outputdir/output.m3u8 -u http://test.com/

Este script codifica mi archivo mp3 (tarda 4 segundos, demasiado tiempo) y se lo pasa al segmentador m3u8 para segmentarlo en archivos .TS de 10 segundos.

Probé este flujo con el mediastreamvalidator de Apple en mi mac y dije que estaba bien. ¡Así que lo jugué en QuickTime, pero hay aproximadamente 0.2 segundos en blanco entre cada archivo .TS!

Así que aquí está mi situación, es una pesadilla, no puedo obtener una transmisión de mp3 simple a través del protocolo HLS. ¿Existe una solución simple de TRABAJO para segmentar un mp3? ¿Por qué no puedo segmentar directamente el archivo mp3 en varios archivos mp3 como lo hace el archivador multimedia de Apple?



Sé que esta es una pregunta antigua, pero estoy usando esto en VLC:

## To start playing the playlist out to the encoder cvlc -vvv playlist.m3u --sout rtp:127.0.0.1 --ttl 2 ## To start the encoder cvlc rtp:// --sout=''#transcode{acodec=mp3,ab=96}:duplicate{dst=std{access=livehttp{seglen=10,splitanywhere=true,delsegs=true,numsegs=15,index=/var/www/vlctest/mystream.m3u8,index-url=http://IPANDPORT/vlctest/mystream-########.ts},mux=ts,dst=/var/www/vlctest/mystream-########.ts},select=audio}''

Tuve problemas si no transmitía el archivo de la lista de reproducción a otra copia de VLC, el primer paso es opcional si ya tiene una fuente de transmisión en vivo. (pero puede usar cualquier fuente para la parte del "codificador").


Servicio Elastic Transcoder: si no necesita el cifrado AES, simplemente coloque su MP3 en un cubo S3 y termine con él:

http://aws.amazon.com/elastictranscoder/

Incluso puede agregar soporte CDN de Cloudfront. (PD: aprecio tu dolor, todo este espacio es una pesadilla).


Solo para transmisión en vivo, debe probar Nginx con el módulo RTMP para este. https://github.com/arut/nginx-rtmp-module Live HLS funciona bastante bien pero con un búfer looooong. Sin embargo, no admite la transmisión de HLS a pedido.

Pieza de configuración del módulo, por ejemplo.

# HLS requires libavformat & should be configured as a separate # NGINX module in addition to nginx-rtmp-module: # ./configure ... --add-module=/path/to/nginx-rtmp-module/hls ... # For HLS to work please create a directory in tmpfs (/tmp/app here) # for the fragments. The directory contents is served via HTTP (see # http{} section in config) # # Incoming stream must be in H264/AAC/MP3. For iPhones use baseline H264 # profile (see ffmpeg example). # This example creates RTMP stream from movie ready for HLS: # # ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264 # -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 # -f flv rtmp://localhost:1935/hls/movie # # If you need to transcode live stream use ''exec'' feature. # application hls { live on; hls on; hls_path /tmp/app; hls_fragment 5s; }


Tu ingles está bien.

Tu frustración es aparente.

P: ¿Cuál es el verdadero problema aquí? Parece que solo necesitas un servidor HLS que funcione, ¿correcto? Debido a los requisitos de Apple, ¿correcto?

¿Puedes usar cualquiera de las implementaciones listas aquí?


Use libfaac insteam de libmp3lame que elimina la pausa de 0.2 segundos.