FFMPEG HLS - Crie apenas uma lista de reprodução ou preveja os tempos dos segmentos antes da codificação

FFMPEG HLS - Crie apenas uma lista de reprodução ou preveja os tempos dos segmentos antes da codificação

Estou usando o ffmpeg para criar um sistema de transcodificação de vídeo sob demanda que atende a mídia por meio do formato HLS.

No momento, posso transcodificar o vídeo e servi-lo conforme são codificados, mas não posso usar a função de busca dos meus players porque a lista de reprodução (.m3u8) só é gerada à medida que os pedaços são codificados. Tentei usar as -gopções, configurando-o para 90 com comprimentos de bloco de 3s e 30fps (29,7fps para ser mais preciso). Mas os comprimentos reais dos pedaços flutuam ligeiramente. Também tentei definir o sinalizador HLS round_durations, mas o player não funciona com ele ativado.

Os tamanhos dos pedaços dependem das cenas que estão sendo transcodificadas ou é possível, examinando o arquivo, determinar rapidamente seu padrão e gerar um .m3u8 virtual completo no início? Ou existe alguma opção para fazer o ffmpeg gerar a lista de reprodução sem realmente codificar os arquivos?

Este é o comando que estou usando agora: (várias linhas para maior clareza)

ffmpeg.exe -i input.mkv -c:v libx264 -c:a aac -crf 22 -preset faster
-format hls -sn -hls_time 3 -hls_base_url http://localhost/media/
-hls_list_size 0 -hls_flags split_by_time -hls_playlist_type event -g 90 -r 30 index.m3u8

Responder1

A menos que você esteja forçando manualmente uma cadência de quadro-chave de alguma forma, o posicionamento do quadro-chave de saída não pode ser adivinhado sem passar os quadros pelo codificador.

Você pode forçar um posicionamento mais preciso do quadro-chave eliminando -ge adicionando-force_key_frames expr:gte(t,n_forced*3)

informação relacionada