it-swarm.com.de

HTTP-Live-Streaming: Der Linux-Albtraum

Ich arbeite an einer Musik-VOD-App auf dem iPhone und dank Apple-Richtlinien muss ich ein HTTP-Live-Streaming ausführen, um vom AppStore akzeptiert zu werden. Da sich Apple jedoch nicht für 98% der Server auf der Erde interessiert, bieten sie keine so magischen HTTP-Live-Streaming-Tools für Linux-basierte Systeme an. Und ab diesem Punkt beginnt der Albtraum.

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

Zuerst besuchte ich den (so berühmten) Beitrag von Carson McDonald . Ergebnis: Das svn segmentate.c war alt, fehlerhaft und ein Albtraum zu kompilieren (Niemand auf dieser Welt kann genau bestimmen, welche Version von ffmpeg sie sind using!) . Dann bin ich auf das Carson-Git-Repo gestoßen - /, aber zu schade, es gibt viel nerviges Ruby-Zeug und live_segmenter.c kann keine MP3-Dateien aufnehmen.

Dann habe ich tiefer gesucht. Ich habe dieses Stackoverflow-Thema gefunden, und genau das möchte ich tun. Also habe ich den Rat von juuni befolgt, dieses Skript (httpsegmenter) zu verwenden. Ergebnis: Nichts zu kompilieren, 2 Tage Arbeit und schließlich habe ich es kompiliert (ffmpeg 8.1 mit httpsegmenter rev17). Und nein, dies ist kein gutes Skript, es benötigt MP3-Dateien, aber die erzeugten TS-Dateien und die Indexdatei können von einem Player nicht gelesen werden.

Dann kam der Autor des Beitrags krisbulman mit einer Lösung und gab sogar eine gepatchte Version des m3u8-Segmenters von sich aus ( git repo ). Ich teste es: Nicht kompilieren, nichts tun. Also nahm ich die Originalversion von johnf https://github.com/johnf/m3u8-segmenter . Ich habe es geschafft zu kompilieren und es funktioniert wunderbar (nicht wirklich). Ich habe diese Befehlszeile verwendet (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 kodiert meine MP3-Datei (es dauert 4 Sekunden, zu lang) und leitet sie an den m3u8-segmenter weiter, um sie in 10 Sekunden .TS-Dateien zu segmentieren.

Ich habe diesen Stream mit Apples Mediastreamvalidator auf meinem Mac getestet und er sagte, dass er in Ordnung sei. Also habe ich es in Quicktime gespielt, aber zwischen den einzelnen .TS-Dateien sind etwa 0,2 Sekunden leer !!

Hier ist meine Situation, es ist ein Albtraum, ich kann keinen einfachen MP3-Stream über das HLS-Protokoll erhalten. Gibt es eine einfache WORKING-Lösung, um eine MP3 zu segmentieren? Warum kann ich die mp3-Datei nicht direkt in mehrere mp3-Dateien segmentieren, wie es der Mediafilesegmenter von Apple tut?

21
Ethan0026

Verwenden Sie libfaac insteam von libmp3lame, wodurch die 0,2 Sekunden Pause eliminiert wird.

5
vchola

Elastic Transcoder Service - Wenn Sie keine AES-Verschlüsselung benötigen, werfen Sie Ihre MP3-Dateien einfach in einen S3-Bucket und erledigen Sie damit: 

http://aws.Amazon.com/elastictranscoder/

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

4

Nur für Live-Streaming sollten Sie Nginx mit RTMP-Modul für dieses versuchen. https://github.com/arut/nginx-rtmp-module Live-HLS funktioniert ziemlich gut, aber mit looooong Puffer .. _. Es unterstützt jedoch kein On-Demand-HLS-Streaming. 

Beispiel für die Konfiguration eines Moduls 

# 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;
}
2
kubanoid

Welche Probleme hatten Sie mit dem httpsegmenter? Hierbei handelt es sich um eine einzelne C-Quelldatei, die nur mit einigen von ffmpeg (oder libav) bereitgestellten Bibliotheken verknüpft wird. Ich unterhalte ein Gentoo-Ebuild dafür, da ich damit zeitversetztes Funkgerät benutze. Wenn Sie Gentoo betreiben, ist das Bauen so einfach:

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

Unter Ubuntu musste ich sicherstellen, dass sowohl libavutil-dev als auch libavformat-dev installiert waren. Der Build sieht also 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 erstellt ist (und sobald ich eine Audio-Quell-URL habe), ist die Verwendung ziemlich einfach: curl zum Streamen des Audios, ffmpeg, um es von der Quelle (oft MP3) in AAC umzucodieren, und Segmenter, um es zusammenzufassen:

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 aufnehmen (MP3 oder AAC, nicht Flash), in Mono-AAC mit 32 KBit/s transkodiert und für das HTTP-Live-Streaming aufgespielt werden. Lassen Sie es in ein Verzeichnis auslagern, das von Ihrem Webserver bereitgestellt wird, und Sie können loslegen.

Sobald die Show fertig ist, ist das Konvertieren in eine einzelne .m4a, die als Podcast bereitgestellt werden kann, ebenfalls einfach:

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

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

Ich hatte Probleme, wenn ich die Wiedergabelistendatei nicht zu einer anderen VLC-Kopie streame. Der erste Schritt ist optional, wenn Sie bereits eine Live-Streaming-Quelle haben. (Sie können jedoch jede Quelle für den "Encoder" -Abschnitt verwenden).

0
jeremy

Sie können versuchen, unsere Mediendienste auf der Windows Azure-Plattform zu verwenden: http://mingfeiy.com/how-to-generate-http-live-streaming-hls-content-using-windows- Azure-Media-Dienste/

Sie können Ihr Video mithilfe unseres Portals im HLS-Format codieren und streamen, ohne dass Konfiguration und Codierung erforderlich sind.

0
Mingfei Yan

Dein Englisch ist gut.

Ihre Frustration ist offensichtlich.

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

Können Sie eine der hier aufgeführten vorgefertigten Implementierungen verwenden:

0
paulsm4