Isso pode ser conseguido usando o muxer de segmento e o demuxer de concatenação.
Passo 1 Segmente a entrada
Suponha que você deseje extrair 00:50
para 02:20
da origem capturada. Vamos dizer que o tamanho do GOP é de 3 segundos. Como seu ponto de partida pode ser o último quadro de um GOP, precisamos iniciar um comprimento de GOP antes. Portanto, o ajuste é 00:47
e a duração do extrato é 01:33
. Então,
ffmpeg -ss 0:57 -t 01:33 -i input.mp4 -c copy -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4
Isso criará segmentos, cada um com comprimento de GOP. Então, não use isso para fluxos intra-codificados:)
Step 2 Apare os segmentos da cabeça e da cauda
Exclua todos os segmentos supérfluos na cabeça e na cauda - possível se o comprimento do GOP for pequeno. Em seguida, apare os segmentos de topo e de cauda corretos:
ffmpeg -ss 2 -i seg00.mp4 -crf 18 -map [v] -map [a] seg00a.mp4
ffmpeg -t 2 -i seg46.mp4 -crf 18 -map [v] -map [a] seg46a.mp4
Etapa 3 Concat
a) Prepara o arquivo de concatio segments.txt
file 's00a.mp4'
file 's01.mp4'
file 's02.mp4'
...
file 's44.mp4'
file 's45.mp4'
file 's46a.mp4'
b)
ffmpeg -f concat -i segments.txt -c copy -fflags +genpts trimmed.mp4
Como você está trabalhando em uma captura ao vivo, pode enviar para TS em vez de MP4, exceto para a saída final.