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
fpsem todas as qualidades; - GOP rígido:
-g=-keyint_min,-sc_threshold 0escenecut=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.