Como cortar em quadros exatos usando ffmpeg?

22

Estou tentando usar o ffmpeg para cortar arquivos de vídeo em horários 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 sempre começa 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 alteração nos resultados. Existe uma opção adicional que preciso especificar? Eu tentei vários formatos de arquivo, MKV, AVI, MP4, e não parece que o problema está relacionado ao codec. Aqui está um arquivo que eu tentei:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Estou esquecendo de algo?

curmil
fonte
aparece esta foi respondida na lista de discussão (e NB que, com cópia -vcodec você não pode "realmente" pegar corte quadro específico, uma vez que só pode sincronizar novamente no i-frames
rogerdpack
@ user39364 Perguntei na lista de e-mails e essa opção não faz o que o OP quer. Eu também aprendi algo novo :)
slhck
Só queria nota que eu achei um método para cortar a quadros exatos usando melt, consulte os arquivos de vídeo com precisão de corte de linha de comando - Super User
sdaau

Respostas:

46

Acabei de aprender que o timecode_frame_startnão funciona assim. A única maneira de iniciar quadros específicos é converter um número de quadros em ss.mssintaxe ou hh:mm:ss.ms. Portanto, se o seu vídeo estiver a 25 qps e você quiser começar com 133 quadros, precisará

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 em fluxo de bits ( -c:v copy) não é possível, pois nem todos os quadros são intra-codificados e podem permanecer sozinhos.

-ss sempre terá precisão de quadro.

Se você deseja codificar um número específico de quadros, use -frames:v, por exemplo:

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

Você também pode usar filtros de vídeo , mas o suporte a áudio pode não ser exato. E, aparentemente, a busca por quadros ainda não é um recurso. Você pode seguir este tópico da lista de discussão de usuários do FFmpeg para obter mais informações:

você pode usar -vf selectpara uma seleção precisa de quadros (algo como -vf 'select=gte(n\,100)'pular os 100 primeiros quadros)

slhck
fonte
3
para vídeos com quadros suspensos (por exemplo, 29,97 fps) com mais de 10 minutos; como você calcularia com precisão o tempo para um quadro específico?
GFoley83
o select=gte(n\,100)método funciona, mas a busca está diminuindo o desempenho. Se você testar codificando apenas 30 quadros por vez, quanto mais o vídeo for iniciado, mais ffmpeg demora para ser concluído por causa da busca.
Adam Grant
6

A opção

-vf select = "entre (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º a (inclui) 300º quadro, a contagem de sequências começa em 0.

Nuo Chen
fonte