Stream 24/7 yang tidak menyambung ulang di antara video: satu ffmpeg yang dialirkan melalui pipe
Video
Saluran live yang memutar video jadi sepanjang hari memiliki dua desain mudah, dan keduanya kehilangan sesuatu. Merestart ffmpeg untuk setiap video memutus koneksi RTMP di setiap pergantian. Daftar putar concat dibaca sekali saat mulai, sehingga video baru harus menunggu restart berikutnya.
Desainnya
Setiap video dikonversi sekali menjadi MPEG-TS pada ukuran dan frame rate stream; video vertikal diletakkan di atas salinan kabur dari dirinya sendiri, bukan bar hitam. Satu proses ffmpeg membaca MPEG-TS dari standard input dan meng-encode dengan bitrate konstan serta keyframe setiap dua detik, sesuai harapan live ingest. Feeder kecil menulis file yang telah disiapkan ke dalam pipe tersebut satu per satu, pada kecepatan real-time, memilih file berikutnya di setiap pergantian: video yang belum pernah diputar terlebih dahulu, lalu yang paling lama tidak diputar. Pembaca MPEG-TS ffmpeg melihat bahwa timestamp setiap file dimulai ulang dan menggesernya, sehingga outputnya berjalan tanpa putus.
Detail satu: kecepatan dari byte pertama
Versi pertama kami memulai jam saat ffmpeg dimulai. Menyiapkan file pertama memakan waktu sembilan detik, sehingga feeder mengira tertinggal sembilan detik dan mengirim semuanya sekaligus. Memulai jam pada byte pertama yang ditulis memperbaikinya: run selama 53 detik menghasilkan stream selama 53 detik.
Detail dua: audio di sambungan
Saat pergantian, audio file berikutnya dimulai 17 milidetik sebelum audio file sebelumnya berakhir. Encoder memperingatkan bahwa inputnya "mundur dalam waktu" dan muxer menambal timestamp. Resampling dengan aresample=async=1:min_hard_comp=0.01:first_pts=0 memangkas atau menambah bantalan pada tumpang tindih tersebut sebelum encoder melihatnya. Dalam run sedikit lebih dari satu menit dengan lima pergantian, setiap timestamp audio dan video dalam stream yang diterima naik, dan stream didekode tanpa satu pun error.
Detail tiga: beberapa peringatan adalah normal
Setiap file memulai ulang penghitung MPEG-TS dan jamnya, sehingga ffmpeg melaporkan "Packet corrupt" dan "timestamp discontinuity" di setiap pergantian. Baris-baris tersebut diharapkan, dan kami mengecualikannya dari log agar error yang sebenarnya terlihat jelas.
Watchdog
Jika ffmpeg keluar atau progresnya berhenti selama satu menit, stream akan dimulai ulang dengan jeda yang semakin panjang dan mengirim pesan setelah kegagalan berulang. Dalam pengujian kami, kami menghentikan encoder secara manual; stream kembali aktif tujuh detik kemudian, dan video yang ditambahkan saat proses berjalan masuk ke rotasi tanpa perlu reconnect. Restart adalah reconnect singkat, jadi atur siaran YouTube agar mulai otomatis dan tidak berhenti otomatis. Stream key disamarkan di setiap baris log, termasuk milik ffmpeg. Studio menyertakan channel live ini sebagai layanan systemd.