2012-06-10 32 views
20

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

Mi objetivo es simple: tomar un MP3, segmentarlo y generar un archivo de índice simple .m3u8. Busqué en Google "HTTP Live Streaming Linux" y "¡Qué bueno! ¡Mucha gente ya lo ha hecho!"

Primero, visité the (so famous) post by 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án usando!). Luego me encontré con the Carson's git repo, pero lástima, hay muchas cosas molestas con ruby ​​y live_segmenter.c no puede tomar archivos mp3.

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

Luego el autor de la publicación krisbulman, vino 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. Logré compilar y milagro que funciona (no realmente). que utilizan esta línea de comandos (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 codifican mi archivo mp3 (tarda 4 segundos, demasiado tiempo), y pasarlo a la M3U8-segmentación para segmentar en 10 segundos Archivos .TS

He probado esta corriente con el mediastreamvalidator de Apple en mi mac, y decía 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 simple secuencia de mp3 sobre el protocolo HLS. ¿Existe una solución de TRABAJO simple para segmentar un mp3? ¿Por qué no puedo segmentar directamente el archivo mp3 en múltiples archivos mp3 como lo hace el mediafilesegmenter de Apple?

+1

Su Inglés está muy bien, pero su mensaje es largo e incoherente. ¿Podría condensarlo y hacer que se concentre en la pregunta clave? –

+0

La pregunta principal es: ¿existe una solución de trabajo simple para segmentar un archivo mp3 en Debian? – Ethan0026

+2

Bueno, eso explica ese accidentado precipitado. –

Respuesta

0

Tu inglés está bien.

Su frustración es evidente.

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?

Se puede utilizar cualquiera de las implementaciones ya hechos enumerados aquí:

+0

La verdadera pregunta es: ¿existe una solución de trabajo simple para segmentar un archivo mp3 en Debian? Necesito transmitir MUCHOS minutos, y los ready-made a menudo están pagando soluciones. ¿Conoces uno que sea completamente gratis incluso con un montón de flujo? – Ethan0026

+0

P: ¿Por qué el sistema operativo Debian? ¿Qué pasa con un servidor de Magnetix, por ejemplo? ¿O alguna de las otras alternativas sugeridas? ¿Estás dispuesto a pagar por una solución comercial? – paulsm4

+0

No voy a pagar una solución comercial por cosas tan simples. Yo uso Debian OS porque necesito apache, php, mysql y un montón de otras herramientas ... No entiendo por qué tendría que instalar un servidor Magnetix por una cosa tan simple (en teoría) que hacer ... – Ethan0026

5

Uso libfaac insteam de libmp3lame que elimina la segunda ruptura 0,2.

0

Sé que esto es una vieja pregunta, pero yo 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 transmitir los archivos lista de reproducción a otra copia de VLC, el primer paso es opcional si ya tienes una fuente de transmisión en vivo. (pero puede usar cualquier fuente para la parte del "codificador").

2

Para la transmisión en vivo solamente, debe probar Nginx con el módulo RTMP para este. https://github.com/arut/nginx-rtmp-module Live HLS funciona bastante bien, pero con el búfer looooong. Sin embargo, no es compatible con la transmisión HLS bajo demanda.

Pedazo de module`s config 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; 
} 
4

elástico Servicio Transcoder - si no es necesario el cifrado AES acaba de lanzar su MP3 en un cubo de S3 y acabar de una vez:

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

Incluso puede agregar compatibilidad con Cloudfront CDN. (P.S. Aprecio mucho tu dolor, todo este espacio es una pesadilla).

0

¿Qué problemas tenías con httpsegmenter? Es un único archivo fuente en C que solo enlaza con algunas bibliotecas proporcionadas por ffmpeg (o libav). Mantengo un ebuild de Gentoo, ya que lo uso para la radio de conversación con cambio de hora. Si está ejecutando Gentoo, edificio 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 asegurarse de libavutil-dev y libavformat-dev tanto se instala, por lo que la estructura es como la siguiente:

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 fuente de audio URL), el uso es bastante simple: curl para transmitir el audio, ffmpeg para transcodificarlo de lo que sea en la fuente (a menudo MP3) a AAC, y segmentador para descomponerlo:

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 captura una hora de transmisión de audio (debe ser MP3 o AAC, no Flash), la transcodifica a 32 kbps mono AAC y la fragmenta para la transmisión HTTP en vivo. Haga que se descargue en un directorio servido por su servidor web y listo.

Una vez que el programa ha hecho, la conversión a una sola .m4a que se puede servir como un podcast es también sencilla:

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