2012-06-10 12 views
20

Ich arbeite an einer Musik-VOD-App auf dem iPhone, und dank Apple-Richtlinien muss ich ein HTTP-Live-Streaming ausführen, um im AppStore akzeptiert zu werden. Aber da Apple 98% der Server auf der Erde nicht interessiert, bieten sie ihre magischen HTTP-Live-Streaming-Tools für Linux-basierte Systeme nicht an. Und von diesem Punkt an beginnt der Albtraum.HTTP-Live-Streaming: Der Linux-Albtraum

Mein Ziel ist einfach: Nimm eine MP3, segmentiere sie und erzeuge eine einfache .m3u8-Indexdatei. Ich googelte "HTTP Live Streaming Linux" und "Oh großartig! Viele Leute haben das schon gemacht"!

Zuerst besuchte ich the (so famous) post by Carson McDonald. Ergebnis: die svn segmentate.c war alt, fehlerhaft und ein Alptraum zu kompilieren (Niemand in dieser Welt kann präzisieren, welche Version von ffmpeg sie verwenden!). Dann stieß ich auf the Carson's git repo, aber schade, es gibt eine Menge nerviger Ruby Zeug und live_segmenter.c kann keine mp3-Dateien nehmen.

Dann suchte ich tiefer. Ich habe this stackoverflow topic gefunden, und genau das möchte ich tun. So habe ich den Rat von juuni zur Verwendung this script (httpsegmenter) befolgt. Ergebnis: Unmöglich, irgendetwas zu kompilieren, 2 Arbeitstage und schließlich habe ich es geschafft, es zu kompilieren (ffmpeg 8.1 w/httseggenter rev17). Und nein, das ist kein gutes Skript, es nimmt MP3-Dateien, aber die erzeugten ts-Dateien und die Indexdatei können nicht von einem Player gelesen werden.

Dann kam der Autor des Post Krisbulman, mit einer Lösung, und gab sogar eine gepatchte Version von m3u8-Segmenter von seinem eigenen (git repo). Ich teste es: kompiliert nicht, tut nichts. Also nahm ich die Originalversion von Johnf https://github.com/johnf/m3u8-segmenter. Ich habe es geschafft zu kompilieren und es funktioniert (nicht wirklich). ich diese Befehlszeile (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/ 

Dieses Skript meine mp3-Datei kodieren (es dauert 4 Sekunden zu lang), und an den m3u8-Segmentierer zum Segment übergeben Sie es in 10 Sekunden .TS-Dateien.

Ich testete diesen Stream mit Apples mediastreamvalidator auf meinem Mac, und es sagte, dass es in Ordnung war. Also habe ich es in Quicktime gespielt, aber zwischen jeder .TS-Datei sind ca. 0,2 Sekunden leer !!

Also hier ist meine Situation, es ist ein Albtraum, ich kann nicht einen einfachen mp3-Stream über das HLS-Protokoll bekommen. Gibt es eine einfache WORKING-Lösung, um ein MP3 zu segmentieren? Warum kann ich die mp3-Datei nicht direkt in mehrere mp3-Dateien segmentieren, wie das Mediafilesegment von Apple?

+1

Ihr Englisch ist gut, aber Ihr Beitrag ist lang und inkohärent. Könnten Sie es verdichten und es sich auf die Schlüsselfrage konzentrieren? –

+0

Die Hauptfrage ist: Gibt es eine einfache Arbeitslösung, um eine MP3-Datei auf Debian zu segmentieren? – Ethan0026

+2

Nun, das erklärt, dass outrrrrageous acccceent. –

Antwort

0

Ihr Englisch ist in Ordnung.

Ihre Frustration ist offensichtlich.

F: Was ist das eigentliche Problem hier? Es klingt, als ob Sie nur einen funktionierenden HLS-Server benötigen, richtig? Aufgrund von Apple Anforderungen, richtig?

+0

Die eigentliche Frage ist: Gibt es eine einfache Arbeitslösung, um eine MP3-Datei auf Debian zu segmentieren? Ich muss eine Menge von Minuten streamen, und fertig gemacht sind oft zahlende Lösungen. Kennst du einen, der selbst mit vielen Streams völlig kostenlos ist? – Ethan0026

+0

F: Warum Debian OS? Was ist zum Beispiel mit einem Magnetix-Server falsch? Oder eine der anderen vorgeschlagenen Alternativen? Sind Sie bereit für eine kommerzielle Lösung zu bezahlen? – paulsm4

+0

Ich werde keine kommerzielle Lösung für so ein einfaches Zeug bezahlen. Ich benutze Debian OS, weil ich Apache, PHP, MySQL und eine Menge anderer Tools brauche ... Ich verstehe nicht, warum ich einen Magnetix-Server für eine so einfache (in der Theorie) Sache zu tun hätte. – Ethan0026

5

Verwenden libfaac insteam von libmp3lame, welche die 0,2 Sekunden Pause eliminiert:

Können Sie hier aufgeführten die fertigen Implementierungen verwenden.

0

Ich weiß, dass dies eine alte Frage, aber ich bin mit dieser 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}' 

hatte ich Probleme, wenn ich nicht die Playlist-Datei auf eine andere Kopie von VLC streamen hat, der erste Schritt ist optional wenn Sie bereits eine Live-Streaming-Quelle haben. (Sie können jedoch eine beliebige Quelle für den "Encoder" -Anteil verwenden).

2

Nur für Live-Streaming sollten Sie Nginx mit RTMP-Modul für dieses ausprobieren. https://github.com/arut/nginx-rtmp-module Live HLS funktioniert ziemlich gut, aber mit loooong Puffer. Es unterstützt jedoch nicht auf Anforderung HLS-Streaming.

Stück module`s Config zum Beispiel

# 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

Elastic Transcoder Service - wenn Sie benötigen AES-Verschlüsselung nicht nur Ihre MP3 in einem S3 Eimer werfen und mit ihm getan werden:

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

Sie können dann sogar Cloudfront CDN-Unterstützung hinzufügen. (P. S. Ich schätze deinen Schmerz völlig, dieser ganze Raum ist ein Albtraum).

0

Welche Probleme hatten Sie mit httpsegmenter? Es ist eine einzelne C-Quelldatei, die nur mit einigen Bibliotheken verknüpft ist, die von ffmpeg (oder libav) bereitgestellt werden. Ich pflege ein Gentoo ebuild dafür, da ich es verwende, um Talk-Radio zu verschieben. Wenn Sie Gentoo laufen lassen, Gebäude wie dies so einfach ist:

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

Auf Ubuntu hatte ich libavutil-dev und libavformat-dev, um sicherzustellen, wurden beide installiert, so dass der Build sieht ungefähr so ​​aus:

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 

Sobald es gebaut (und sobald ich eine Audioquelle URL haben), Nutzung ist ziemlich einfach: curl die Audio-Stream, ffmpeg es umcodieren von was auch immer es an der Quelle ist (oft MP3) zu AAC und segmenter um es zu zerkleinern:

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 

Damit können Sie eine Stunde Audio-Streaming (MP3 oder AAC, nicht Flash) aufnehmen, in 32-KBit/s Mono-AAC umwandeln und für HTTP-Live-Streaming aufteilen. Lassen Sie es in einem Verzeichnis ablegen, das von Ihrem Webserver bereitgestellt wird, und Sie können loslegen.

Sobald die Show fertig ist, zu einem einzigen .m4a umgewandelt werden, die als Podcast serviert werden können, ist auch einfach:

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