HTTP Live Streaming: Le cauchemar de Linux

je travaille sur une application VOD music sur iPhone, et grâce aux directives D'Apple, je dois lancer un Streaming HTTP Live pour être accepté sur L'AppStore. Mais, comme Apple ne se soucie pas de 98% des serveurs sur terre, ils ne fournissent pas leurs outils de Streaming HTTP Live si magiques pour les systèmes basés sur Linux. Et à partir de ce point, le cauchemar commence.

mon but est simple : prendre un MP3, le segmenter et générer un simple .fichier d'index m3u8. J'ai googlé "HTTP Live Streaming Linux" et "oh great ! beaucoup de gens l'ont déjà fait"!

tout d'abord, j'ai visité le (si célèbre) post de Carson McDonald . Résultat : le svn segmentate.c était vieux, buggy et un cauchemar à compiler (personne dans ce monde peut préciser quelle version de ffmpeg ils utilisent !). Puis je suis tombé sur the Carson's git repo , mais dommage, il ya beaucoup de choses ruby ennuyeux et live_segmenter.c ne peut pas prendre les fichiers mp3.

puis j'ai cherché plus profondément. J'ai trouvé ce stackoverflow thème , et c'est exactement ce que je veux faire. J'ai donc suivi le Conseil de juuni d'utiliser ce script (httpsegmenter) . Résultat: impossible de compiler quoi que ce soit, 2 jours de travail et finalement j'ai réussi à le compiler (ffmpeg 8.1 w/ httpsegmenter rev17). Et non, ce n'est pas un bon script, il prend des fichiers mp3, mais les fichiers ts générés et le fichier index ne peut pas être lu par un joueur.

puis l'auteur du post krisbulman, est venu avec une solution, et a même donné une version corrigée de m3u8-segmenter par ses propres ( git repo ). Je le teste : ne compile pas, ne fait rien. J'ai donc pris la version originale de johnf https://github.com/johnf/m3u8-segmenter . J'ai réussi à compiler et miracle ça fonctionne (pas vraiment). J'ai utilisé cette ligne de commande (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/

ce script encode mon fichier mp3 (il prend 4 secondes, trop longtemps), et le passe au m3u8-segmenter pour le segmenter en 10 Secondes .Les fichiers TS.

j'ai testé ce flux avec le mediastreamvalidator D'Apple sur mon mac, et il a dit que c'était OK. Donc je l'ai joué dans quicktime, mais il y a environ 0.2 seconde vide entre chaque .Les fichiers TS !!

alors voici ma situation, c'est un cauchemar, Je ne peux pas obtenir un simple flux mp3 sur le protocole HLS. Est-il une solution de travail simple pour segmenter un mp3 ? Pourquoi ne puis-je pas segmenter directement le fichier mp3 en plusieurs fichiers mp3 comme le fait mediafilesegmenter D'Apple?

21
demandé sur Community 2012-06-10 22:03:54

7 réponses

utilise l'insteam libfaac de libmp3lam qui élimine la coupure de 0,2 seconde.

5
répondu vchola 2012-08-10 21:55:05

Elastic Transcoder Service - si vous n'avez pas besoin de cryptage AES il suffit de jeter votre MP3 dans un seau S3 et être fait avec elle:

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

vous pouvez alors même ajouter le support CDN Cloudfront. (P. S. j'apprécie votre douleur, tout cet espace est un cauchemar).

4
répondu Francis Shanahan 2013-12-03 03:10:20

pour le streaming en direct seulement, vous devriez essayer Nginx avec module RTMP pour celui-ci. https://github.com/arut/nginx-rtmp-module Live HLS fonctionne assez bien, mais avec loooooong tampon. Cependant, il ne prend pas en charge le streaming HLS à la demande.

pièce de la configuration du module par exemple

# 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
répondu kubanoid 2013-03-12 14:33:05

quels problèmes aviez-vous avec httpsegmenter? Il s'agit d'un seul fichier source C qui n'est relié qu'à certaines bibliothèques fournies par ffmpeg (ou libav). Je maintiens un ebuild Gentoo pour elle,comme je l'utilise à la radio de temps-majuscules. Si vous exécutez Gentoo, la construction est aussi simple que ceci:

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

sur Ubuntu, je devais m'assurer que libavutil-dev et libavformat-dev étaient tous les deux installés, donc la construction ressemble à quelque chose comme ceci:

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

une fois qu'il est construit (et une fois que j'ai une URL de source audio), l'usage est assez simple: curl pour diffuser l'audio, ffmpeg pour le transcoder de ce qu'il est à la source (souvent MP3) à AAC, et segmenter pour le fractionner:

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

cela saisit une heure d'audio en streaming (doit être MP3 ou AAC, pas Flash), le transcode à 32 kbps mono AAC, et le découpe pour le streaming HTTP live. Avoir de vidage dans un répertoire servi par votre serveur et vous êtes bon pour aller.

une fois l'émission terminée, conversion en simple .m4a qui peut être servi comme podcast est aussi simple:

cat `ls -rt ExampleStream-*.ts` | \
ffmpeg -i - -acodec copy -absf aac_adtstoasc ExampleStream.m4a 2>/dev/null
1
répondu salfter 2016-03-25 20:23:23

votre anglais est très bien.

votre frustration est évidente.

Q: Quel est le vrai problème ici? On dirait que vous avez juste besoin d'un serveur HLS fonctionnel, correct? A cause des besoins de la pomme, correct?

pouvez-vous utiliser l'une des implémentations prêtes à l'emploi énumérées ici:

0
répondu paulsm4 2012-06-10 18:11:34

je sais que c'est une vieille question, mais je l'utilise dans 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}'

j'ai eu des problèmes si je n'ai pas streamé le fichier playlist vers une autre copie de VLC, la première étape est facultative si vous avez déjà une source de streaming en direct. (mais vous pouvez utiliser n'importe quelle source pour le "codeur" partie).

0
répondu jeremy 2013-01-11 21:41:09

vous pouvez essayer d'utiliser nos services de médias sur la plate-forme Windows Azure: http://mingfeiy.com/how-to-generate-http-live-streaming-hls-content-using-windows-azure-media-services/

vous pouvez encoder et diffuser votre vidéo au format HLS en utilisant notre portail sans configuration ni codage requis.

0
répondu Mingfei Yan 2013-01-18 22:47:09