ffmpeg - Como posso cortar começando precisamente a partir de um quadro-chave enquanto copia o codec?

1

Using -ss as input option together with -c:v copy might not be accurate since ffmpeg is forced to only use/split on i-frames. Though it will—if possible—adjust the start time of the stream to a negative value to compensate for that. Basically, if you specify "second 157" and there is no key frame until second 159, it will include two seconds of audio (with no video) at the start, then will start from the first key frame. So be careful when splitting and doing codec copy.

Para evitar isso, tentei encontrar primeiro os carimbos de data e hora dos quadros necessários para -ss e -to construindo um bloco de todos os locais próximos frames. Gerei os tiles usando

ffmpeg -i "INPUT.mkv" -ss 09:55 -t 3 -vf "drawtext=fontfile=I\:\Misc\\~Software\\~OS\\I386\\arial.ttf: fontsize=60: text='F%{n}\(%{pict_type}\)\@%{pts\:hms}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1,scale=320:-1,tile=layout=12x10" tiles%03d.png

e, de acordo com eles, o quadro-chave necessário deve começar a partir de 00: 09: 56.012, e o último quadro necessário deve ser 00: 10: 00.224. No entanto, o fragmento criado ao cortar com esses timestamps

ffmpeg -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -ss 09:56.012 -to 00:10:00.224 -vcodec copy -acodec copy J01.mkv

começa em um quadro não chave (somente som) e termina em um local errado também. Em contraste, cortar o mesmo fragmento no Avidemux funciona bem, mesmo com as configurações de saída de vídeo e áudio configuradas como Copy (IIUC, sem recodificação e iniciando a partir de um quadro sem chave). Os timestamps exibidos no Avidemux também são diferentes ( -ss 09:56.346 -to 10:00.558 v.s. -ss 09:56.012 -to 10:00.224 ).

Eu também tentei cortar por pkt_dts_time ( link ), mas isso também não funcionou.

p.s. Outro procedimento semelhante ao que estou tentando fazer (ao acima mencionado Avidemux) é quando na Sony Vegas você aumenta o zoom na linha do tempo até que você possa passar de um quadro a outro, então defina o primeiro quadro após a mudança de cena (que também é um quadro-chave). ) como o ponto de partida e o último quadro da mesma cena (após o qual vem o próximo quadro-chave que não é necessário) como o ponto final e, em seguida, renderizar. Algo como isso também pode ser feito no Avidemux enquanto copia os fluxos de áudio e vídeo.

edit1: aqui está o log de -copyts version: pastebin. com / Cxzrc8Er. Devo fazer outros também?

edit2: Aqui estão os resultados para "PATHTO\ffprobe.exe" -select_streams v -show_entries packet=pts_time,flags -of compact -read_intervals 580%600 "INPUT.mkv" | findstr K .

packet|pts_time=578.160000|flags=K
packet|pts_time=581.205000|flags=K
packet|pts_time=583.499000|flags=K
packet|pts_time=585.042000|flags=K
packet|pts_time=588.671000|flags=K
packet|pts_time=594.885000|flags=K
packet|pts_time=596.012000|flags=K

Eu também experimentei todo o combo de comandos (tiles, listando quadros dessa maneira, cortando fragmentos de duas maneiras diferentes) em outros 2 vídeos, e os resultados são semelhantes. Os tempos dos quadros-chave listados no terminal, usando o comando sugerido, correspondem aos dos blocos feitos por mim; e, geralmente, cortar pelo meu método deixa uma pequena seção congelada (~ 1s) no início e, às vezes, vários quadros indesejados no final e o corte pelo seu método deixa um fluxo de vídeo vazio mais longo no começo.

Também encontrei um melhor fragmento de vídeo para experimentar, porque é visualmente mais fácil determinar quanto dos quadros desejados estão faltando e se os indesejados foram adicionados (imgur.com / a / DTzmt, parte relevante pode ser baixada em bit.ly / Kmnz112f1). Sua solução funcionou melhor também.

Além disso, só para ter certeza: Você quis dizer -ss 09: 56.01 3 e não -ss 09: 56.01 2 em sua solução original? E estou certo em adivinhar que isso geralmente funciona em vídeos que você está cortando e que isso não está fora do meu?

por Imfego 12.05.2016 / 23:41

1 resposta

0

Tente

ffmpeg -ss 09:56.013 -i "INPUT.mkv" -map 0:0 -map 0:4 -map 0:5 -map 0:6 -to 00:10:00.224 -vcodec copy -acodec copy -avoid_negative_ts make_zero J01.mkv
    
por 13.05.2016 / 12:15