Utiliser FFMPEG pour diffuser en continu des fichiers vidéo vers un serveur RTMP
ffmpeg
gère le streaming RTMP comme entrée ou sortie, et ça marche bien.
je veux diffuser quelques vidéos (une sélection dynamique gérée par un script python) sur un serveur RTMP, et je fais actuellement quelque chose de très simple: diffuser mes vidéos une par une avec FFMPEG sur le serveur RTMP, cependant cela provoque une rupture de connexion à chaque fois qu'une vidéo se termine, et le flux est prêt à partir lorsque la prochaine vidéo commence.
j'aimerais diffuser ces vidéos sans aucune la connexion se rompt continuellement, alors le flux peut être vu correctement.
j'utilise 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 cherché des solutions de rechange sur internet pendant de nombreux jours, et j'ai trouvé des gens qui parlaient d'utiliser un tuyau nommé comme entrée dans ffmpeg
, je l'ai essayé et ça ne fonctionne pas bien depuis ffmpeg
ne ferme pas seulement le flux RTMP quand une nouvelle vidéo arrive, mais se ferme aussi.
Est-il possible d' faire cela ? (flux d'une dynamique de la liste de lecture de vidéos avec ffmpeg
pour RTMP server sans sauts de connexion
3 réponses
mise à Jour (que je ne peux pas supprimer la accepté de répondre): la bonne solution est d'implémenter un démuxer personnalisé, similaire à celui de concat. Il n'y a actuellement aucun autre moyen propre. Tu dois te salir les mains et te mettre du 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 le concat demuxer et suppose que tous vos fichiers médias source utilisent le même codec. L'exemple est basé sur MPEG-TS, mais il en va de même pour le programme de gestion de la circulation routière.
créer un fichier playlist contenant une énorme liste de points d'entrée pour votre playlist 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 ne sont que des placeholders.
créer un script qui garde la trace de votre sélection actuelle 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
[...]
commencez à 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
Vous pouvez Piper votre boucle sur un tampon, et à partir de ce tampon vous pipez sur votre instance de streaming.
Dans le shell, il devrait ressembler à:
#!/bin/bash
for i in *.mp4; do
ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts -
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream
bien sûr, vous pouvez utiliser n'importe quel type de boucle, également en parcourant une liste de lecture.
- je découvre que mpeg est un peu plus stable, puis x264 pour le flux d'entrée
- Je ne sais pas pourquoi, mais un minimum de 2 threads pour la compression mpeg fonctionne mieux
- la compression d'entrée doit être plus rapide que le taux de trame de sortie, Donc nous obtenons assez rapidement de nouvelles entrées
- en raison de l'horodatage non continu nous devons les sauter et en générer un nouveau dans la sortie
- la taille du tampon doit être assez grande pour que la boucle ait assez de temps pour obtenir le nouveau clip.
je travaille sur la solution basée sur python, n'est pas encore terminée, mais à part quelques avertissements, Mon flux de test fonctionne plusieurs jours:
ceci utilise un format de sélection xml. Et la liste de Lecture est dynamique, de cette façon vous pouvez éditer toujours la liste de lecture actuelle, et changer des pistes ou en ajouter de nouvelles.
besoin de créer deux fichiers de sélection et à la fin de chaque fichier spécifier un lien vers un autre fichier.
list_1.txt
ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'
list_2.txt
ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'