Потокове відео 24/7 без перепідключення між роликами: один ffmpeg, що отримує дані через канал

Відео

Живий канал, який цілодобово відтворює готові відео, має два прості варіанти реалізації, і в обох щось втрачається. Перезапуск ffmpeg для кожного відео розриває з'єднання RTMP при кожному переході. Плейлист concat зчитується один раз на старті, тому нове відео чекає на наступний перезапуск.

Конструкція

Кожне відео конвертується один раз у 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» при кожному переході. Ці рядки очікувані, і ми виводимо їх із журналу, щоб справжні помилки виділялися.

Вартовий

Якщо ffmpeg завершується або його прогрес зупиняється на хвилину, трансляція перезапускається зі зростаючими паузами й надсилає повідомлення після повторних збоїв. У нашому тесті ми вручну завершили кодувальник; трансляція відновилася за сім секунд, а відео, додане під час роботи, приєдналося до ротації без перепідключення. Перезапуск — це коротке перепідключення, тому налаштуйте автоматичний початок трансляції на YouTube та вимкніть її автоматичне завершення. Ключ трансляції замасковано в кожному рядку журналу, включно з рядками самого ffmpeg. Studio постачає цей живий канал як службу systemd.

Оновлено: