Стрим 24/7 кој не се поврзува повторно помеѓу видеата: еден ffmpeg подхрануван преку цевка
Видео
Жив канал кој ги пушта готовите видеа постојано има две едноставни решенија, и двете нешто пропуштаат. Рестартирањето на ffmpeg за секое видео ја губи RTMP врската при секое префрлување. Конкатенационата листа се чита еднаш на почетокот, па затоа ново видео чека на следното рестартирање.
Решението
Секое видео се конвертира еднаш во MPEG-TS со големината и фрејмрејтот на стримот; вертикално видео стои врз заматена копија од себе наместо на црни ленти. Еден ffmpeg процес чита MPEG-TS од својот стандарден влез и кодира со константен битрејт со клучен фрејм на секои две секунди, како што очекува живото внесување. Мал подхранувач ги запишува подготвените фајлови во таа цевка еден по друг, во реално време, избирајќи го следниот фајл при секое префрлување: видеа што никогаш не се пуштени први, потоа најмалку скоро пуштените. MPEG-TS читачот на ffmpeg гледа дека временските ознаки на секој фајл почнуваат одново и ги поместува, така што неговиот излез тече без прекин.
Детал еден: темпо од првиот бајт
Нашата прва верзија го стартуваше часовникот кога стартуваше ffmpeg. Подготовката на првиот фајл траеше девет секунди, па подхранувачот мислеше дека е девет секунди зад и ги испрати сите одеднаш. Стартувањето на часовникот при првиот запишан бајт го поправи тоа: 53-секундно пуштање произведе 53 секунди стрим.
Детал два: звукот на спојот
При префрлување, звукот на следниот фајл почна 17 милисекунди пред звукот на претходниот фајл да заврши. Енкодерот предупреди дека неговиот влез оди „назад во времето“ и мултиплексерот поправи временска ознака. Ресемплирањето со aresample=async=1:min_hard_comp=0.01:first_pts=0 ги сече или дополнува таквите преклопувања пред енкодерот да ги види. При пуштање малку под една минута со пет префрлувања, сите временски ознаки за аудио и видео во примениот стрим растеа, и стримот се декодира без ниту една грешка.
Детал три: некои предупредувања се нормални
Секој фајл ги рестартира своите MPEG-TS бројачи и својот часовник, па ffmpeg пријавува „Packet corrupt“ и „timestamp discontinuity“ при секое префрлување. Тие линии се очекувани, и ние ги држиме надвор од логот за вистинските грешки да се истакнат.
watchdog-от
Ако ffmpeg излезе или напредокот застане на една минута, преносот се рестартира со сè подолги паузи и испраќа порака по повеќекратни неуспеси. Во нашиот тест го убивме енкодерот рачно; преносот се врати седум секунди подоцна, а видеото додадено за време на извршувањето се вклучи во ротацијата без повторно поврзување. Рестартирањето е кратко повторно поврзување, па затоа поставете YouTube преносот да започнува автоматски и да не запира автоматски. Клучот за пренос е маскиран во секоја линија од дневникот, вклучително и тој на ffmpeg. Studio го испорачува овој канал во живо како systemd услуга.