À l'aide de FFMPEG pour diffuser en continu des vidéos des fichiers sur un serveur RTMP
ffmpeg
poignées RTMP streaming en entrée ou en sortie, et il fonctionne bien.
Je veux diffuser quelques vidéos (une liste d'écoute dynamique géré par un script python) à un serveur RTMP, et je suis actuellement en train de faire quelque chose de très simple: la diffusion de mes vidéos une par une avec FFMPEG pour le serveur RTMP, cependant cela provoque une connexion pause à chaque fois une fin de vidéo, et le flux est prêt à aller quand la prochaine vidéo commence.
Je voudrais diffuser les vidéos sans sauts de connexion en continu, le flux pourrait être correctement affiché.
- Je utiliser cette commande pour diffuser mes vidéos une par une pour le serveur
ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \
"rtmp://mystreamingserver/app/streamName"
J'ai regardé pour des solutions sur internet pour de nombreux jours, et j'ai trouvé des gens parler à l'aide d'un tube nommé comme entrée dans ffmpeg
, je l'ai essayé et ça ne fonctionne pas bien depuis ffmpeg
n'est pas seulement de fermer le flux RTMP quand une nouvelle vidéo vient mais aussi se referme.
Est-il possible de faire cela ? (flux d'une dynamique de la liste de lecture de vidéos avec ffmpeg
à RTMP server sans sauts de connexion
- À l'aide d'un tube nommé est la bonne façon de faire. Pouvez-vous élaborer sur la façon dont cela n'a pas fonctionné pour vous?
- J'ai utilisé le canal nommé comme une entrée dans l'ffmpeg ffmpeg de pause et d'attente pour certaines données de la pipe, puis j'ai essayé
cat video.mp4 > fifo
et ffmpeg début de streaming et de quitter après la diffusion de la vidéo. Je pense que je ne sais pas comment utiliser le canal nommé le droit chemin, quand j'ai faitcat video1.mp4 video2.mp4 > fifo
ffmpeg montrer l'erreurstream 4, offset 0x1d83c: partial file
après la diffusion de la première vidéo. Je sais que c'est me faire mal, j'ai pour transmettre les données vidéo d'une manière appropriée à travers le tuyau. - J'ai réussi à envoyer un flux statique de la liste de lecture de vidéos en utilisant pour chaque vidéo un tuyau (ex vid1.mp4 -> pipe1, vid2.mp4 -> pipe2 etc). Puis-je écrire en un seul flux de canal nommé "flux" de cette façon,
cat pipe1 pipe2 pipe3 > stream
, et j'utilise le flux de la pipe comme une entrée dans FFMPEG pour publier mes flux, mais depuis que je suis à la recherche pour une liste d'écoute dynamique comment puis-je envoyer plus de vidéos pour le "stream" pipe afin de le garder vivant le flux ? je n'ai pas le comprendre encore. (Remarque, sauf pour la première vidéo, j'ai dû couper les métadonnées de chaque fichier vidéo à l'aide de la queue de commande pour l'obtention de ce travail) - ffmpeg est un nouveau "concat" protocole qui...pourrait aider...
- ffmpeg.org/trac/ffmpeg/wiki/...
- ffmpeg [NO-re] [bla bla] -f flv "namedpipe" ffmpeg -re -f flv -je "namedpipe"
Vous devez vous connecter pour publier un commentaire.
Mise à jour (que je ne peux pas supprimer la accepté de répondre): la bonne solution est de mettre en œuvre une coutume demuxer, similaire à la méthode concat un. Il n'y a actuellement aucun autre moyen propre. Vous devez obtenir vos mains sales et le code!
Ci-dessous est un vilain hack. C'est une très mauvaise façon de le faire, il suffit de ne pas!
La solution utilise la concat demuxer et assume tous vos fichiers multimédias sources d'utiliser le même codec. L'exemple est basé sur le MPEG-TS, mais la même chose peut être fait pour RTMP.
Faire un fichier de liste de lecture tenant un énorme liste de points d'entrée pour une vous une liste d'écoute dynamique avec le format suivant:
file 'item_1.ts'
file 'item_2.ts'
file 'item_3.ts'
[...]
file 'item_[ENOUGH_FOR_A_LIFETIME].ts'
Ces fichiers sont uniquement des espaces réservés.
Faire un script qui garde une trace de votre liste de lecture en cours de l'index et crée des liens symboliques à la volée pour
current_index + 1
ln -s /path/to/what/to/play/next.ts item_1.ts
ln -s /path/to/what/to/play/next.ts item_2.ts
ln -s /path/to/what/to/play/next.ts item_3.ts
[...]
Commencer à jouer
ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>
Obtenir chassé et a appelé les noms par une colère administrateur système
Make a script that keeps track of you current playlist index and creates symbolic links on-the-fly for current_index + 1
? Quel but est-ce pour?-c copy output -f mpegts stream.m3u8
renvoie une erreur.Vous pouvez diriger votre boucle à un tampon, et à partir de ce tampon vous dirigez à votre streaming instance.
En shell, il devrait ressembler à:
Bien sûr, vous pouvez utiliser n'importe quel type de boucle, également en parcourant une liste de lecture.
Je travail sur le langage python solution n'est pas encore complet, mais à l'exception de quelques mises en garde de mon test de flux exécute plusieurs jours:
ffplayout
Il utilise un format xml format de sélection. Et la liste de lecture est dynamique, à la manière que vous pouvez toujours modifier la liste de lecture en cours, et de changer de piste ou en ajouter de nouvelles.
Besoin de créer deux fichiers de listes de lecture et à la fin de chaque fichier spécifier un lien vers un autre fichier.
list_1.txt
list_2.txt
Maintenant tous vous avez besoin est de modifier dynamiquement le contenu de la prochaine liste de lecture de fichier.