Skip to content

Canal a partir de um arquivo

A entrada file transforma um arquivo MP4 local num stream ao vivo de verdade: o arquivo toca em loop. É uma ferramenta de produção para canais de vinheta: um canal técnico de «voltamos já», um canal de promoção e um fallback para quando as fontes caem.

Configuração

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

O arquivo pode ser multi-faixa: várias qualidades de vídeo e várias faixas de áudio em um só MP4 dão um stream MBR completo com seleção de idioma — sem transcodificador no servidor.

Como preparar o arquivo com ffmpeg

Para um arquivo MBR tocar sem emendas, todas as qualidades devem estar perfeitamente alinhadas: timestamps idênticos e keyframes nos mesmos lugares. Isso é conseguido com uma única passada de ffmpeg usando o filtro 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=eng \
  -movflags +faststart \
  promo.mp4

O que importa aqui:

  • uma única passada, uma única fonte, split — todas as qualidades ganham timestamps idênticos;
  • setpts=PTS-STARTPTS — a linha do tempo de cada qualidade começa no zero;
  • o mesmo fps em todas as qualidades;
  • GOP rígido: -g = -keyint_min, -sc_threshold 0 e scenecut=0:open_gop=0 — keyframes estritamente a cada N quadros e nos mesmos lugares; o codificador não pode inseri-los nas mudanças de cena;
  • áudio AAC a 48 kHz estéreo;
  • -movflags +faststart — o índice no começo do arquivo;
  • -metadata:s:v title=... / language=... — as etiquetas de qualidade e os idiomas das faixas acabam nas playlists.

Um exemplo completo e funcional com várias faixas de áudio está no repositório do sapsan: storage/king.sh.

Verificação

Abra http://server/streaming/v/promo/index.m3u8 — na playlist master devem estar todas as qualidades, e a comutação entre elas não deve engasgar.

Próximos passos