Hallo zusammen!
Ich habe eine Methode gefunden, wie ich mit ffmpeg beliebig viele Videos aneinanderreihen kann, ohne dass es zur Unterbrechung kommt. Damit kann ich z.B. Playlisten streamen, brauche mir keine Gedanken über das Quellformat machen und die Listen sind jederzeit dynamisch editierbar (nicht wie bei concat).
Dazu entwickle ich gerade ein Python Tool: https://github.com/jb-alvarado/ffplayout
Im Prinzip funktioniert das ganze so, dass ich über einen Haufen Clips loope und mit ffmpeg abspiele, das ganze in einen Buffer (pv, oder mbuffer) pipe und den Output wieder in ffmpeg einspeise. Als Shell Script würde das dann so aussehen:
for i in *.mp4, do
ffmpeg -i "$i" [codec settings] -f mpegts -
done | muffer -m 31000k | ffmpeg -i pipe: [codec settings] -f flv rtmp://address...
Jetzt ist mir nur folgendes Aufgefallen:
- nehme ich mpegts als pipe Format, muss ich den Stream verlustbehaftet kodieren bevor die zweite ffmpeg das ganze noch mal komprimieren muss. Am besten würde hier mpeg2 funktionieren, es kommt nur gelegentlich mal zu Warnungen das die PTS korrigiert werden müssen
- verwende ich hingegen avi als pipe Format kann ich einen rawvideo Stream in die Pipe schicken, es kommt zu keinen Fehlermeldungen wegen PTS und ich habe einen (fast) verlustfreien Stream in der Pipe. Allerdings läuft hier Audio und Video mit der Zeit asynchron.
- würde ich nur Clips nehmen die alle gleich kodiert sind und ich mit Stream Copy arbeiten wollte, funktioniert das nur reibungslos mit dem Format ismv, allerdings habe ich wieder das gleiche Problem, dass der Stream asynchron wird.
Am liebsten wäre mir Szenario 2 und 3. Ich hätte zwei verschiedene Anwendungen, wo das für mich praktisch wäre, allerdings bekomme ich es nicht hin Audio und Video synchron zu halten.
Habt ihr eine Idee, warum sich die Container unterschiedlich verhalten und wie ich das hinbekommen könnte das alles synchron bleibt?
Grüße
Jonathan