Primeiro segundo da parte cortada do vídeo congelada quando o FFmpeg corta uma parte de um vídeo

Primeiro segundo da parte cortada do vídeo congelada quando o FFmpeg corta uma parte de um vídeo

Eu uso isso para cortar uma parte de um arquivo MP4:

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4

Funciona bem, mas a imagem do vídeo sempre fica congelada no início por 1 segundo.

Não importa de qual arquivo de vídeo eu tento cortar uma parte, leva cerca de 1 segundo antes do vídeo começar.

Aqui está um exemplodo que estou vendo.

Responder1

O problema pode ser que o vídeo esteja tentando ser cortado com base apenas nos quadros-chave e não entre os quadros, e seu tempo inicial 00:36:18está alguns segundos à frente de um quadro-chave. A solução deve ser usar a -copyinkfopçãoque é descrito no manual como:

Ao fazer a cópia do fluxo, copie também os quadros não-chave encontrados no início.

Então seu comando é assim:

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4

Precisaria então ser ajustado para ficar assim, -copyinkfmisturado a ele:

ffmpeg -i input.mp4 -vcodec copy -acodec copy -copyinkf -ss 00:36:18 -to 00:39:50 output.mp4

Responder2

O carimbo de data/hora do qual você está copiando está entre quadros-chave, usar -vcodec copy sempre resultará nesse comportamento se copiar um codec entre quadros e sua entrada não iniciar em um quadro-chave.

Suas opções são fazer uma codificação completa (ou seja, sem cópia -vcodec) ou escolher um carimbo de data/hora diferente para buscar. Você pode encontrar a localização de todos os quadros-chave usando ffprobe, por exemplo.

ffprobe -select_streams v -show_frames -print_format csv -show_entries frame=key_frame,pkt_dts_time input.mp4  | grep "frame,1"

a terceira coluna contém os carimbos de data/hora (em segundos) de todos os quadros-chave. Você deseja aquele mais próximo, mas não posterior, do carimbo de data/hora de destino.

Responder3

Eu também tive esse problema, não tenho conhecimento de por que isso aconteceu e como resolvi. Apenas saiba que este código corrigiu isso para mim:

ffmpeg -ss 00:00:00 -to 00:00:10 -i input.mp4 -c:v copy -c:a copy output.mp4

informação relacionada