Cortar parte do arquivo de vídeo da posição inicial para a posição final com FFmpeg [duplicado]


144

Esta pergunta já tem uma resposta aqui:

Eu tenho um arquivo de vídeo de 30 minutos, mas quero extrair um vídeo de 00:09:23 a 00:25:33.

Posso definir a posição inicial com -ss, mas não consegui encontrar uma para a posição final. Alguma ajuda por favor?

Respostas:


244

Instale o ffmpeg

Certifique-se de baixar uma versão recente doffmpeg e não usar a que acompanha a sua distribuição (por exemplo, Ubuntu). As versões empacotadas de várias distribuições geralmente estão desatualizadas e não se comportam conforme o esperado.

Ou compile você mesmo .

Como cortar um vídeo, sem recodificar

Usar isso para cortar vídeo a partir [start]de [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Aqui, as opções significam o seguinte:

  • -ssespecifica a hora de início, por exemplo, 00:01:23.000ou 83(em segundos)
  • -t especifica a duração do clipe (mesmo formato).
  • Recentes ffmpegtambém possui uma bandeira para fornecer o horário final -to.
  • -c copycopia o primeiro fluxo de bits de vídeo, áudio e legenda da entrada para o arquivo de saída sem recodificá-los. Isso não prejudicará a qualidade e fará com que o comando seja executado em segundos.

Como cortar um vídeo com recodificação

Se você deixar de fora a -c copyopção, ffmpegrecodificará automaticamente a saída de vídeo e áudio de acordo com o formato escolhido. Para vídeo e áudio de alta qualidade, leia o x264 Encoding Guide e o AAC Encoding Guide , respectivamente.

Por exemplo:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

1
No ubuntu 12:10, -c: ve ec: a não funcionava. Eu tive que usar "-acodec copy e -vcodec copy" em seu lugar.
Samuel Lampa

1
@ Samuel Então você está usando uma versão desatualizada, que nem é o FFmpeg real, mas o fork do Libav. Veja: stackoverflow.com/a/9477756/1109017
slhck

Obrigado por isso! se você não especificar uma duração, ela será finalizada?
31414 Jeff

@Jeff Yes! (caractere mínimo)
slhck

3
@Prateek Ao copiar o fluxo de bits de vídeo (em vez de recodificar), você pode cortar apenas em quadros - chave . Se houver quadros-chave nos segundos 1, 2 e 3, mas você desejar cortar no segundo 1,5, o ffmpeg aguardará até o segundo 2 antes de começar a cortar. Isso torna impreciso.
slhck #

26

Eu acho que você pode usar o seguinte comando agora.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Veja também o ffmpeg Doc , ou esta página wiki .


6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileversão mais simples
nwgat 20/11

3
Eu tive que usar a ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4versão (com -copyts), caso contrário, cortou incorretamente (com tela preta no começo). Obrigado pelo segundo link embora.
Necronomicron

Isso é ótimo, a última coisa que eu queria era calcular a duração dos pontos finais.
Tomasz Gandor

A opção -to responde à pergunta que realmente foi feita. O restante das respostas é impertinente ou obsoleto.
James Bowery

12

É estranho que ninguém tenha sugerido o trim filtro .

Solte tudo, exceto o segundo minuto de entrada:

ffmpeg -i INPUT -vf trim=60:120

Mantenha apenas o primeiro segundo:

ffmpeg -i INPUT -vf trim=duration=1

Largue tudo, exceto do segundo 13 para o segundo 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
Sim, é bom mencionar trime atrim. Eu costumo usá-las ao filtrar, mas os usuários devem observar que a filtragem requer recodificação .
Llogan

Você é meu herói. Eu precisava muito de um filtro que fizesse isso.
fahadash

5

Você pode usar esses dois métodos que funcionam para Windows e Linux.

Existem duas maneiras de dividir arquivos de vídeo por ffmpeg. O primeiro é bom por si só, mais do que isso - é mais rápido, mas às vezes cria arquivos de saída com certas falhas. Portanto, nesses casos, existe a segunda maneira de dividir arquivos de vídeo: é consideravelmente mais lento, os arquivos de saída são maiores, mas parece que eles sempre têm o mesmo nível de qualidade dos arquivos de entrada usados.

Caminho 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Caminho 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- o início da parte de um vídeo ffmpeg é cortado. Formato:, 00:00:00.0000significando horas: minutos: segundos: milissegundos.

  • <duration>- a duração da parte de um vídeo ffmpeg é reduzida. Mesmo formato que acima.

Exemplos:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

O ffmpeg corta uma parte do arquivo de vídeo a partir de 1 hora 19 minutos e 0 segundos. A duração da sequência de vídeo cortada é de 5 minutos e 0 segundos.


Ok, thnx. Irá verificar os documentos e experimentá-lo amanhã.
criar o seu alerta

3
-sameqnão significa "mesma qualidade" e foi removido do ffmpeg. Use em -codec copyvez disso. Além disso, não se esqueça da -toopção.
Llogan

Corrigi os comandos em sua cotação, pois estavam bastante desatualizados. Por favor, não copie e cole as informações sem citá-las corretamente.
slhck

-1

Você pode usar isso

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Aqui você tem que dar a duração do vídeo. ie 00: 25: 33-00: 09: 23


1
Como mencionei na outra resposta: Com o seu comando, você está recodificando o arquivo, o que não é absolutamente necessário e resulta em qualidade reduzida e aumento no tempo de processamento.
slhck

-2

Eu uso a seguinte sintaxe para cortar vídeo com ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t é usado para definir a duração em segundos - você não pode especificar o horário final, mas isso deve funcionar para você.


1
Por que você está configurando o FFmpeg para recodificar o arquivo? Observe que -sameqnão significa "mesma qualidade".
slhck
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.