Ροή 24/7 χωρίς επανασύνδεση μεταξύ βίντεο: μία ffmpeg τροφοδοτούμενη μέσω σωλήνα

Βίντεο

Ένα κανάλι ζωντανής μετάδοσης που παίζει έτοιμα βίντεο όλο το 24ωρο έχει δύο απλές σχεδιάσεις, και οι δύο χάνουν κάτι. Η επανεκκίνηση της ffmpeg για κάθε βίντεο διακόπτει τη σύνδεση RTMP σε κάθε εναλλαγή. Η λίστα αναπαραγωγής concat διαβάζεται μία φορά κατά την εκκίνηση, οπότε ένα νέο βίντεο περιμένει την επόμενη επανεκκίνηση.

Η σχεδίαση

Κάθε βίντεο μετατρέπεται μία φορά σε MPEG-TS στο μέγεθος και τον ρυθμό καρέ της ροής. Ένα κάθετο βίντεο τοποθετείται πάνω σε μια θολή αντιγραφή του αντί για μαύρες μπάρες. Μία διαδικασία ffmpeg διαβάζει MPEG-TS από την τυπική της είσοδο και κωδικοποιεί με σταθερό ρυθμό bit, με ένα keyframe κάθε δύο δευτερόλεπτα, όπως αναμένεται από την είσοδο ζωντανής μετάδοσης. Ένας μικρός τροφοδότης γράφει τα έτοιμα αρχεία σε αυτόν τον σωλήνα το ένα μετά το άλλο, με ρυθμό πραγματικού χρόνου, επιλέγοντας το επόμενο αρχείο σε κάθε εναλλαγή: βίντεο που δεν έχουν παιχτεί πρώτα, έπειτα τα λιγότερο πρόσφατα. Ο αναγνώστης MPEG-TS της ffmpeg βλέπει ότι οι χρονικές σφραγίδες κάθε αρχείου ξεκινούν από την αρχή και τις μετατοπίζει, ώστε η έξοδός του να τρέχει χωρίς διακοπή.

Λεπτομέρεια 1η: Ρυθμός από το πρώτο byte

Η πρώτη μας έκδοση ξεκινούσε το ρολόι όταν ξεκινούσε η ffmpeg. Η προετοιμασία του πρώτου αρχείου took εννέα δευτερόλεπτα, οπότε ο τροφοδότης νόμιζε ότι ήταν εννέα δευτερόλεπτα πίσω και τα έστειλε όλα μαζί. Η εκκίνηση του ρολογιού στο πρώτο byte που γράφτηκε το διόρθωσε: μια εκτέλεση 53 δευτερολέπτων παρήγαγε 53 δευτερόλεπτα ροής.

Λεπτομέρεια 2η: Ο ήχος στη ραφή

Σε μια εναλλαγή, ο ήχος του επόμενου αρχείου ξεκινούσε 17 χιλιοστά του δευτερολέπτου πριν τελειώσει ο ήχος του προηγούμενου αρχείου. Ο κωδικοποιητής προειδοποιούσε ότι η είσοδός του πήγαινε «πίσω στον χρόνο» και ο muxer διόρθωνε μια χρονική σφραγίδα. Η δειγματοληψία με aresample=async=1:min_hard_comp=0.01:first_pts=0 κόβει ή συμπληρώνει τέτοιες επικαλύψεις πριν τις δει ο κωδικοποιητής. Σε μια εκτέλεση λίγο πάνω από ένα λεπτό με πέντε εναλλαγές, κάθε χρονική σφραγίδα ήχου και βίντεο στην παραληφθείσα ροή αυξανόταν, και η ροή αποκωδικοποιήθηκε χωρίς κανένα σφάλμα.

Λεπτομέρεια 3η: Ορισμένες προειδοποιήσεις είναι φυσιολογικές

Κάθε αρχείο επανεκκινεί τους μετρητές MPEG-TS και το ρολόι του, οπότε η ffmpeg αναφέρει «Packet corrupt» και «timestamp discontinuity» σε κάθε εναλλαγή. Αυτές οι γραμμές αναμένονται και τις κρατάμε εκτός του αρχείου καταγραφής ώστε τα πραγματικά σφάλματα να ξεχωρίζουν.

Ο Φύλακας

Αν το ffmpeg τερματιστεί ή η πρόοδός του σταματήσει για ένα λεπτό, η ροή επανεκκινείται με αυξανόμενα διαστήματα παύσης και στέλνει μήνυμα μετά από επαναλαμβανόμενες αποτυχίες. Στη δοκιμή μας σκοτώσαμε τον κωδικοποιητή χειροκίνητα· η ροή επέστρεψε επτά δευτερόλεπτα αργότερα, και ένα βίντεο που προστέθηκε κατά τη διάρκεια της εκτέλεσης εντάχθηκε στην εναλλαγή χωρίς επανασύνδεση. Η επανεκκίνηση είναι μια σύντομη επανασύνδεση, οπότε ρυθμίστε τη μετάδοση στο YouTube ώστε να ξεκινά αυτόματα και να μην σταματά αυτόματα. Το κλειδί ροής αποκρύπτεται σε κάθε γραμμή καταγραφής, συμπεριλαμβανομένης της δικής του ffmpeg. Το Studio παρέχει αυτό το κανάλι ζωντανής μετάδοσης ως υπηρεσία systemd.

Ενημερώθηκε: