Smart Trim um arquivo de vídeo h.264 .MP4 no ffmpeg

1

Eu gostaria de tirar o vídeo h.264 capturado ao vivo como uma entrada e apará-lo para começar com um fade de preto e terminar com um fade a preto com a menor codificação possível. Estes pontos de fade in / out podem cair entre quadros I. Não é possível aparar em quadros não-I sem recodificar.

Eu fiz um diagrama:

Eugostariadedividiroarquivodeentradaemtrêspartes.AparteAiniciarianoI-Frameantesdoponto1eterminarianoponto1.AparteCcomeçarianoI-Framenoponto2eterminarianopróximoI-Frameapósofadeparapreto.Elesseriamre-codificadosemtodooformatoI-Frame.Essesdoissegmentosseriamrelativamentecurtos,de10a30segundos.AparteB(amaiorpartedovídeo)podesersimplesmentetranscodificadausandoocodec:copy.

PartesAeamp;Cseriaaparado(automaticamenteusandodetecçãodepretooumanualmente)eentãotodoovídeoseriaconcatenadousandooffmpeg.

Eugostariadeusaroffmpegporqueécomissoqueeuestoumaisfamiliarizadoeorestodomeufluxodetrabalhoousaexclusivamente.Quaislinhasdecomandoconseguiriamisso?

Paraoscuriosos,aquiestáminhalinhadecomandodetrabalhoparacapturarvídeoaovivoemsegmentoscodificados.Apartirdesteponto,éfácildescartarvídeodesnecessárioerecodificarsegmentos,senecessário,paraaparar.Opassofinaléconcatenarossegmentos.

ffmpeg-fdshow-rtbufsize702000k-video_size1920x1080-framerate29.97-pixel_formatuyvy422-ivideo="Decklink Video Capture":audio="Decklink Audio Capture" -threads 0 -c:v libx264 -s 1280x720 -crf 18 -profile:v main -level 3.1 -pix_fmt yuv420p -c:a libvo_aacenc -b:a 128k -ac 1 -f segment -segment_time 0.01 -reset_timestamps 1 seg%02d.mp4
    
por HGBells 12.02.2016 / 17:30

1 resposta

0

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.

    
por 12.02.2016 / 19:43