Como cortar quadros exatos usando o ffmpeg?

17

Estou tentando usar o ffmpeg para cortar arquivos de vídeo em momentos precisos. A ajuda do ffmpeg mostra uma opção -timecode_frame_start para especificar o quadro inicial, mas não consigo fazer esse comando funcionar. O vídeo resultante começa sempre no início do vídeo original. Aqui está um exemplo do comando que estou executando:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Mudei a opção timecode_frame_start antes e depois das outras opções sem alterar os resultados. Existe uma opção adicional que eu preciso especificar? Eu tentei vários formatos de arquivo, mkv, avi, mp4, e não parece que o problema é relacionado ao codec. Aqui está um arquivo que eu tentei:

link

Estou sentindo falta de algo?

    
por curmil 09.08.2012 / 02:26

2 respostas

42

Acabei de saber que o timecode_frame_start não funciona assim. A única maneira de começar em quadros específicos é converter um número de quadros para ss.ms syntax ou hh:mm:ss.ms . Então, se seu vídeo está a 25 fps e você quer começar em 133 quadros, você precisaria

133 / 25 = 5.32

Então, corra

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Observe que o corte em quadros exatos com cópia de fluxo de bits ( -c:v copy ) não é possível, pois nem todos os quadros são codificados internamente e podem ficar por conta própria.

Se você estiver usando uma versão recente do ffmpeg (> 2.1), a transcodificação (isto é, usar qualquer coisa, mas -c:v copy ), -ss sempre será preciso de quadro.

Você também tem a opção de usar filtros de vídeo , mas o suporte de áudio pode não ser exato. E aparentemente, procurar em quadros ainda não é uma característica. Você pode seguir este thread da lista de discussão de usuários do FFmpeg para mais informações:

you may use -vf select for accurate frame selection (something like -vf 'select=gte(n\,100)' to skip the 100 first frames)

    
por 09.08.2012 / 13:55
0

A opção

-vf select=“between(n\,start_frame_num\,end_frame_num),setpts=PTS-STARTPTS"
por exemplo.,
-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

corta o vídeo de (inclui) 200º para (inclui) o 300º quadro, a contagem da sequência começa em 0.

    
por 09.10.2018 / 08:05