2012-06-10 12 views
20

Sto lavorando a un'app VOD musicale su iPhone e, grazie alle linee guida Apple, devo eseguire uno streaming live HTTP per essere accettato su AppStore. Tuttavia, dal momento che Apple non si interessa del 98% dei server sulla terra, non forniscono i loro strumenti di streaming live HTTP così magici per i sistemi basati su Linux. E da questo punto inizia l'incubo.HTTP Live Streaming: l'incubo di Linux

Il mio obiettivo è semplice: prendere un MP3, segmentarlo e generare un semplice file indice .m3u8. Ho cercato su google "HTTP Live Streaming Linux" e "Oh grandioso! Molte persone lo hanno già fatto"!

In primo luogo, ho visitato the (so famous) post by Carson McDonald. Risultato: la svn segmentate.c era vecchia, buggata e un incubo da compilare (Nessuno in questo mondo può precisare quale versione di ffmpeg sta usando!). Poi mi sono imbattuto in the Carson's git repo, ma troppo male, c'è un sacco di roba fastidiosa ruby ​​e live_segmenter.c non può prendere file mp3.

Poi ho cercato più profondamente. Ho trovato this stackoverflow topic ed è esattamente quello che voglio fare. Quindi ho seguito il consiglio di juuni per usare this script (httpsegmenter). Risultato: impossibile compilare nulla, 2 giorni di lavoro e alla fine sono riuscito a compilarlo (ffmpeg 8.1 w/httpsegmenter rev17). E no, questo non è un buon script, prende i file mp3, ma i file ts generati e il file indice non possono essere letti da un giocatore.

Poi l'autore del post krisbulman, è venuto con una soluzione, e persino dato una versione modificata di M3U8-segmenter dal suo stesso (git repo). Lo collaudo: non si compila, non fa niente. Quindi ho preso la versione originale da johnf https://github.com/johnf/m3u8-segmenter. Sono riuscito a compilare e miracolo funziona (non proprio). Ho usato questa riga di 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/ 

Questo script codificare il mio file mp3 (ci vogliono 4 secondi, troppo lungo), e passarlo al M3U8-segmenter di segmentare in 10 secondi File .TS.

Ho testato questo flusso con mediastreamvalidator di Apple sul mio mac e ho detto che era OK. Quindi l'ho riprodotto in quicktime, ma ci sono circa 0,2 secondi in bianco tra ogni file .TS !!

Quindi ecco la mia situazione, è un incubo, non riesco a ottenere un semplice flusso mp3 tramite il protocollo HLS. C'è una soluzione di LAVORO semplice per segmentare un mp3? Perché non posso segmentare direttamente il file mp3 in più file mp3 come fa il mediafilesegmenter di Apple?

+1

tuo inglese è bene, ma il tuo post è lungo e incoerente. Potresti condensare e metterlo a fuoco sulla domanda chiave? –

+0

La domanda principale è: esiste una soluzione semplice e funzionante per segmentare un file mp3 su Debian? – Ethan0026

+2

Beh, questo spiega che l'accusa è orrenda. –

risposta

0

L'inglese è a posto.

La tua frustrazione è evidente.

Q: Qual è il vero problema qui? Sembra che tu abbia solo bisogno di un server HLS funzionante, corretto? A causa dei requisiti Apple, corretto?

è possibile utilizzare una qualsiasi delle implementazioni ready-made qui elencate:

+0

La vera domanda è: esiste una soluzione semplice e funzionante per segmentare un file mp3 su Debian? Ho bisogno di eseguire lo streaming di MOLTO minuti e le soluzioni pronte sono spesso a pagamento. Ne conosci uno completamente gratuito anche con un sacco di stream? – Ethan0026

+0

D: Perché il sistema operativo Debian? Cosa c'è che non va con un server Magnetix, ad esempio? O qualcuna delle altre alternative suggerite? Sei disposto a pagare per una soluzione commerciale? – paulsm4

+0

Non ho intenzione di pagare una soluzione commerciale per cose così semplici. Uso il sistema operativo Debian perché ho bisogno di apache, php, mysql e un sacco di altri strumenti ... Non capisco perché dovrei installare un server Magnetix per una cosa così semplice (in teoria) da fare .. – Ethan0026

5

Uso libfaac insteam di libmp3lame che elimina l'0,2 secondi pausa.

0

So che questa è una vecchia questione, ma io sto usando questo in 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}' 

Ho avuto problemi se non lo streaming del file di playlist ad un'altra copia di VLC, il primo passo è opzionale se hai già una fonte di streaming live. (ma puoi usare qualsiasi fonte per la porzione "codificatore").

2

Solo per lo streaming live, è necessario provare Nginx con il modulo RTMP per questo. https://github.com/arut/nginx-rtmp-module Live HLS funziona piuttosto bene ma con buffer di memoria. Tuttavia, non supporta lo streaming HLS su richiesta.

Pezzo di module`s config per esempio

# 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

elastico Transcoder servizio - se non hai bisogno di crittografia AES solo buttare il vostro MP3 in un secchio S3 e da fare con esso:

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

È anche possibile aggiungere il supporto di Cloudfront CDN. (P.S. Apprezzo pienamente il tuo dolore, questo intero spazio è un incubo).

0

Quali problemi avevi con httpsegmenter? È un singolo file sorgente C che si collega solo con alcune librerie fornite da ffmpeg (o libav). Mantengo un ebuild Gentoo per questo, dato che lo uso per il talk radio time-shift. Se si sta eseguendo Gentoo, edificio è semplice come questo:

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

Su Ubuntu, ho dovuto fare in modo libavutil-dev e libavformat-dev erano entrambi installato, quindi la costruzione simile a questa:

Una volta costruito (e una volta che ho un URL sorgente audio), l'utilizzo è abbastanza semplice: arricciare per trasmettere l'audio, ffmpeg per transcodificarlo da qualunque cosa sia all'origine (spesso MP3) a AAC e segmentatore per dividerlo:

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 

Questo preleva un'ora di streaming audio (deve essere MP3 o AAC, non Flash), la transcodifica a 32 kbps mono AAC e la suddivide in streaming live HTTP. Fatelo saltare in una directory servita dal vostro server web e siete a posto.

Una volta che lo spettacolo ha fatto, la conversione in un unico .m4a che può essere servito come un podcast è anche semplice:

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