Aliran 24/7 yang tidak menyambung semula antara video: satu ffmpeg yang disuap melalui paip
Video
Saluran langsung yang memutar video siap sepanjang masa mempunyai dua reka bentuk mudah, dan kedua-duanya kehilangan sesuatu. Memulakan semula ffmpeg untuk setiap video memutuskan sambungan RTMP pada setiap peralihan. Senarai main concat dibaca sekali pada permulaan, jadi video baharu menunggu permulaan semula seterusnya.
Reka bentuk
Setiap video ditukar sekali menjadi MPEG-TS pada saiz dan kadar bingkai aliran; video menegak diletakkan di atas salinan kabur dirinya sendiri dan bukan bar hitam. Satu proses ffmpeg membaca MPEG-TS daripada input piawai dan mengekod pada kadar bit malar dengan bingkai kunci setiap dua saat, seperti yang dijangka oleh pengambilan langsung. Penyuap kecil menulis fail yang disediakan ke dalam paip itu satu demi satu, pada kelajuan masa nyata, memilih fail seterusnya pada setiap peralihan: video yang belum pernah dimainkan dahulu, kemudian yang paling lama tidak dimainkan. Pembaca MPEG-TS ffmpeg melihat bahawa cap masa setiap fail bermula semula dan menggesernya, jadi outputnya berjalan tanpa gangguan.
Butiran satu: kelajuan daripada bait pertama
Versi pertama kami memulakan jam apabila ffmpeg dimulakan. Penyediaan fail pertama mengambil masa sembilan saat, jadi penyuap menyangka ia ketinggalan sembilan saat dan menghantar semuanya sekaligus. Memulakan jam pada bait pertama yang ditulis menyelesaikan masalah ini: larian 53 saat menghasilkan aliran 53 saat.
Butiran dua: audio pada sambungan
Pada peralihan, audio fail seterusnya bermula 17 milisaat sebelum audio fail sebelumnya tamat. Pengekod memberi amaran bahawa inputnya "mundur dalam masa" dan multiplexer menampal cap masa. Penyampelan semula dengan aresample=async=1:min_hard_comp=0.01:first_pts=0 memangkas atau menambah bantalan kepada pertindihan sedemikian sebelum pengekod melihatnya. Dalam larian lebih kurang seminit dengan lima peralihan, setiap cap masa audio dan video dalam aliran yang diterima meningkat, dan aliran didekod tanpa sebarang ralat.
Butiran tiga: beberapa amaran adalah normal
Setiap fail memulakan semula pengira MPEG-TS dan jamnya, jadi ffmpeg melaporkan "Packet corrupt" dan "timestamp discontinuity" pada setiap peralihan. Baris-baris ini dijangkakan, dan kami mengecualikannya daripada log supaya ralat sebenar menyerlah.
Watchdog
Jika ffmpeg keluar atau kemajuannya terhenti selama seminit, strim dimulakan semula dengan jeda yang semakin panjang dan menghantar mesej selepas kegagalan berulang. Dalam ujian kami, kami mematikan pengekod secara manual; strim kembali dalam masa tujuh saat, dan video yang ditambah semasa berjalan menyertai giliran tanpa perlu sambung semula. Mula semula ialah sambung semula yang ringkas, jadi tetapkan siaran YouTube untuk bermula secara automatik dan tidak berhenti secara automatik. Kunci strim disamarkan dalam setiap baris log, termasuk yang daripada ffmpeg sendiri. Studio menyediakan saluran langsung ini sebagai perkhidmatan systemd.