Поток 24/7, който не прекъсва връзката между видеоклиповете: един ffmpeg, подаден през тръба

Видео

Канал на живо, който излъчва готови видеоклипове денонощно, има две лесни реализации и и двете пропускат нещо. Рестартирането на ffmpeg за всеки видеоклип прекъсва RTMP връзката при всяко превключване. Конкатенацията на плейлист се чете веднъж при стартиране, затова нов видеоклип чака следващото рестартиране.

Решението

Всеки видеоклип се конвертира веднъж в MPEG-TS с размерите и честотата на кадрите на потока; вертикален видеоклип се поставя върху размазано копие на самия него, вместо върху черни ленти. Един процес на ffmpeg чете MPEG-TS от стандартния си вход и кодира с постоянна битрейт, с ключов кадър на всеки две секунди, както се очаква от live ingest. Малък подател записва подготвените файлове в тази тръба един след друг, в реално време, избирайки следващия файл при всяко превключване: видеоклипове, които не са били пускани първи, след това най-рядко пусканите. 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“ при всяко превключване. Тези редове са очаквани и ги изключваме от дневника, за да се откроят реалните грешки.

The watchdog

Ако ffmpeg прекрати работа или напредъкът му спре за минута, потокът се рестартира с нарастващи паузи и изпраща съобщение след многократни неуспехи. В нашия тест убихме енкодера ръчно; потокът се възстанови седем секунди по-късно, а видео, добавено по време на изпълнението, се включи в ротацията без повторно свързване. Рестартът е кратко повторно свързване, затова настройте излъчването в YouTube да стартира автоматично и да не спира автоматично. Ключът на потока е маскиран във всеки ред от дневника, включително в тези на ffmpeg. Studio доставя този канал на живо като systemd услуга.

Обновено: