web-dev-qa-db-fra.com

Comment pouvons-nous transcoder le flux rtmp en direct en flux hls en utilisant ffmpeg?

J'essaie de convertir un flux rtmp en direct en flux hls en temps réel.

J'ai une idée après avoir lu

http://sonnati.wordpress.com/2011/08/30/ffmpeg-%E2%80%93-the-swiss-army-knife-of-internet-streaming-%E2%80%93- partie-iv /

je suis capable de convertir le flux rtmp en direct en hls mais pas au moment de l'exécution. lorsque j'exécute la commande et teste les fichiers hsl (.m3u8 et .ts), je ne peux pas voir, mais lorsque j'interromps la commande et que je vérifie, j'obtiens les fichiers hls comme requis.

J'ai recherché une solution sur google, mais je n'ai pas pu obtenir de réponse correcte.

Un corps peut-il m'aider?

Merci d'avance...

34
Kiran

Voici un petit guide pour la diffusion HLS avec n'importe quel fichier ou flux d'entrée:

Je suis l'approche de user1390208, donc j'utilise FFMPEG uniquement pour produire le flux rtmp que mon serveur reçoit ensuite pour fournir HLS. Au lieu d'Unreal/Wowza/Adobe, j'utilise le serveur gratuit nginx avec le module rtmp, qui est assez facile à configurer. Voici comment je le fais en bref: Any input file or stream -> ffmpeg -> rtmp -> nginx server -> HLS -> Client ou plus détaillé:

fichier ou flux vidéo d'entrée (http, rtmp, peu importe) -> ffmpeg transcode en direct vers x.264 + aac, sorties vers rtmp -> nginx prend le rtmp et sert un HLS à l'utilisateur (client). Donc, côté client, vous pouvez utiliser VLC ou autre et vous connecter au fichier .m3u8 fourni par nginx.

  • J'ai suivi ce guide de configuration pour nginx.
  • This est mon fichier de configuration nginx.
  • Voici comment j'utilise ffmpeg pour transcoder mon fichier d'entrée en rtmp:

    ffmpeg -re -i mydirectory/myfile.mkv -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    (Le .mkv est 1080p avec un son 5.1, selon votre entrée, vous devez utiliser des débits inférieurs!)

D'où obtenez-vous le flux rtmp?

  • Un fichier? Ensuite, vous pouvez utiliser exactement mon approche.
  • Un serveur X avec un flux Y? Ensuite, vous devez modifier la commande ffmpeg pour:

    ffmpeg -re -i rtmp://theServerX/yourStreamY -c:v libx264 -b:v 5M -pix_fmt yuv420p -c:a:0 libfdk_aac -b:a:0 480k -f flv rtmp://localhost:12345/hls/mystream;
    

    ou si votre flux rtmp est déjà encodé en h.264/aac, vous pouvez essayer d'utiliser l'option copy dans ffmpeg pour diffuser le contenu directement vers nginx.

Comme vous le voyez dans mon fichier de configuration nginx:

  • Mon serveur rtmp a une "application" appelée "hls". C'est la partie qui décrit où nginx écoute le flux rtmp de ffmpeg et c'est pourquoi ffmpeg diffuse vers rtmp://localhost:12345/hls/mystream;
  • Mon serveur http a le location /hls. Cela signifie que dans VLC, je peux me connecter à http://myServer:80/hls/mystream.m3u8 pour accéder au flux HLS.

Tout est-il clair? Bonne diffusion!

70
user3069376

Essayez ces paramètres de ligne de commande RTMP vers HLS:

ffmpeg -v verbose -i rtmp://<Host>:<port>/<stream> -c:v libx264 -c:a aac -ac 1 -strict -2 -crf 18 -profile:v baseline -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 <pathToFolderYouWantTo>/<streamName>.m3u8

Il peut y avoir un certain retard dans le flux HLS. Cependant, cela fonctionnera.

21
Sumoanand

Comme mise à jour de cette question, j'ai réussi à terminer le transcodage en direct de RTMP vers HLS sans utiliser ffmpeg, comment?

Eh bien juste en utilisant exactement le même fichier de configuration nginx partagé par user3069376 et en faisant très attention aux chemins que vous générez le manifeste .m3uh, l'option hls dans le module RTMP devrait s'en occuper.

Quant au lecteur vidéo, le Video.Js a fonctionné comme un charme o

2
chinchillaboy