Skip to content

Канал из файла

Вход file делает из локального MP4-файла полноценный живой поток: файл проигрывается по кругу. Это продакшн-инструмент для каналов-заставок: технический канал «скоро вернемся», канал-промо, а также матрац при падении источников.

Настройка

streams:
  promo:
    inputs:
    - file:
        path: /storage/promo.mp4
    dvr: {}

Файл может быть многодорожечным: несколько качеств видео и несколько аудиодорожек в одном MP4 дают полноценный MBR-поток с выбором языка — без транскодера на сервере.

Как подготовить файл через ffmpeg

Чтобы MBR-файл проигрывался бесшовно, все качества должны быть идеально выровнены: одинаковые таймстемпы и ключевые кадры в одних и тех же местах. Это достигается одним прогоном ffmpeg с фильтром split:

ffmpeg -y -i source.mkv \
  -filter_complex "\
[0:v:0]split=3[vhi][vme][vlo]; \
[vhi]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=25,setpts=PTS-STARTPTS[v1]; \
[vme]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=25,setpts=PTS-STARTPTS[v2]; \
[vlo]scale=960:540:force_original_aspect_ratio=decrease,pad=960:540:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=25,setpts=PTS-STARTPTS[v3]" \
  -map "[v1]" -c:v:0 libx264 -b:v:0 6000k -g:v:0 100 -keyint_min:v:0 100 \
    -sc_threshold:v:0 0 -x264-params:v:0 "scenecut=0:open_gop=0" \
  -map "[v2]" -c:v:1 libx264 -b:v:1 3000k -g:v:1 100 -keyint_min:v:1 100 \
    -sc_threshold:v:1 0 -x264-params:v:1 "scenecut=0:open_gop=0" \
  -map "[v3]" -c:v:2 libx264 -b:v:2 1200k -g:v:2 100 -keyint_min:v:2 100 \
    -sc_threshold:v:2 0 -x264-params:v:2 "scenecut=0:open_gop=0" \
  -map 0:a:0 -c:a:0 aac -b:a:0 192k -ac 2 -ar 48000 \
  -metadata:s:v:0 title="1080p" -metadata:s:v:1 title="720p" -metadata:s:v:2 title="540p" \
  -metadata:s:a:0 language=rus \
  -movflags +faststart \
  promo.mp4

Что здесь принципиально:

  • один прогон, один источник, split — все качества получают одинаковые таймстемпы;
  • setpts=PTS-STARTPTS — таймлайн каждого качества начинается с нуля;
  • одинаковый fps во всех качествах;
  • жесткий GOP: -g = -keyint_min, -sc_threshold 0 и scenecut=0:open_gop=0 — ключевые кадры строго каждые N кадров в одних и тех же местах, кодировщик не имеет права вставлять их по смене сцены;
  • аудио AAC 48 кГц стерео;
  • -movflags +faststart — индекс в начале файла;
  • -metadata:s:v title=... / language=... — подписи качеств и языки дорожек попадают в плейлисты.

Рабочий полный пример с несколькими аудиодорожками лежит в репозитории sapsan: storage/king.sh.

Проверка

Откройте http://server/streaming/v/promo/index.m3u8 — в мастер-плейлисте должны быть все качества, переключение между ними не должно вызывать рывков.

Что дальше