Como codificar um arquivo de entrada para vários fluxos HLS com o FFmpeg, incluindo a lista de reprodução principal

1

Este é o cenário:

Eu preciso codificar um único arquivo de entrada, assumir com libx264 para vários fluxos HLS, e o objetivo é também gerar a playlist principal HLS com o mesmo snippet FFmpeg.

A partir da documentação do FFmpeg sobre o mesmo, eles descrevem um cenário que leva em várias entradas, como fluxos de transporte MPEG, classificando os fluxos de áudio e vídeo e, em seguida, gerando vários fluxos HLS conforme especificado acima, conforme mostrado aqui . Veja a documentação em var_stream_map na mesma página.

Uma pergunta semelhante foi feita antes , mas o caso do usuário descreve o cenário documentado pelo FFmpeg.

Todos os leads valerão, obrigado.

Acompanhamento:

Eu fiz algum progresso na consulta acima.

Pode-se definir a mesma entrada mais de uma vez, permitindo tanto um remapeamento das entradas como uma nova codificação em tempo real que pode ser multiplexada no HLS como mostrado abaixo com o codificador h264_nvenc :

ffmpeg -loglevel debug -threads 4 -i /home/lin/Desktop/src/sowdtow.webm \
-i /home/lin/Desktop/src/sowdtow.webm \
-map '0:v' -c:v h264_nvenc -s 1920x1080 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 3500k -maxrate:v 4250k -bufsize:v 8400k -map '0:a' -c:a aac -ab 128k \
-map '1:v' -c:v h264_nvenc -s 1280x720 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 2800k -maxrate:v 2996k -bufsize:v 4200k -map '1:a' -c:a aac -ab 128k \
-f hls -var_stream_map "v:0,a:0 v:1,a:1" -hls_segment_filename 'vs%v/file_%03d.ts' -hls_time 5 -master_pl_name 'mainmanifest.m3u8' /home/lin/Desktop/dest/vs%v/manifest.m3u8

No entanto, este comando tem a seguinte anomalia: Ele envia o último fluxo (-map 1: v -map: 1: a) duas vezes, ignorando completamente o primeiro e o segundo fluxo:

less mainmanifest.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2"
vs0/manifest.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2"
vs1/manifest.m3u8

O que pode ajudar a restringir o problema a um problema de remapeamento para o muxer HLS.

Ainda investigando. Isso fede a um erro de sintaxe em algum lugar no comando acima, será atualizado assim que eu tiver uma correção para isso.

Editar:

Foi causado por um bug no FFmpeg: link que agora está corrigido.

    
por 林正浩 21.02.2018 / 02:09

1 resposta

0

Então, aparentemente, a duração incorreta do EXTINF observada em fluxos alternativos foi causada por um defeito fixo , veja patchwork aqui .

Um fragmento de amostra que produzirá três versões HLS variantes, supondo que o fluxo de vídeo recebido tenha uma taxa de quadros de 29,97 fps e usando um tamanho GOP fixo, via codificador NVENC, pode ser feito da seguinte forma:

ffmpeg -loglevel debug -threads 4 -vsync 1 -i '/home/lin/Desktop/src/sowdtow.webm' \
-vf yadif -g 29.97 -r 29.97 \
-b:v:0 5250k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 0 \
-b:v:1 4200k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 1 \
-b:v:1 3150k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 2 \
-b:a:0 256k \
-b:a:0 192k \
-b:a:0 128k \
-c:a aac -ar 48000  -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 \
-f hls -var_stream_map "v:0,a:0  v:1,a:1 v:2,a:2" \
-master_pl_name  master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size 10 -master_pl_publish_rate 10 -hls_flags delete_segments+discont_start+split_by_time  \
"/home/lin/Desktop/dest/vs%v/manifest.m3u8"

Marcando como resolvido.

    
por 12.03.2018 / 17:09