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


Esta questão já tem uma resposta aqui:

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

Eu posso definir a posição inicial com -ss, mas eu não consegui encontrar um para a posição final. Alguma ajuda por favor?


116


origem




Respostas:


Instalar o ffmpeg

Assegure-se de que você baixar uma versão recente do ffmpege não use o que vem com sua distribuição (por exemplo, Ubuntu). Versões compactadas de várias distribuições geralmente estão desatualizadas e não se comportam como esperado.

Ou compile você mesmo.

Como cortar um vídeo sem re-codificar

Use isso para cortar o vídeo de [start] para [duration]:

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

Aqui, as opções significam o seguinte:

  • -ss especifica o horário de início, por ex. 00:01:23.000 ou 83 (em segundos)
  • -t especifica a duração do clipe (mesmo formato).
  • Recente ffmpeg também tem uma bandeira para fornecer o tempo final com -to.
  • -c copy copia o primeiro bitstream 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.

Note que com versões mais antigas do ffmpeg, este comando pode não ter precisão de quadro ao copiar os fluxos de bits.

Como cortar um vídeo, sem recodificar - método preciso

Se você tiver uma versão antiga do ffmpeg e quiser a precisão do quadro, use isso:

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

No entanto, há uma desvantagem. O vídeo terá que ser decodificado até atingir a posição sugerida por -ss, e só então começa a copiar o fluxo de bits. Isso pode levar muito tempo, especialmente para vídeos realmente longos.

Como cortar um vídeo, com a re-codificação

Se você deixar de fora -c copy opção, ffmpeg recodificará automaticamente o vídeo e o áudio de saída de acordo com o formato escolhido. Para vídeo e áudio de alta qualidade, leia o Guia de codificação x264 e a Guia de codificação AAC, respectivamente.

Por exemplo:

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

Como explicado por Procurando com FFmpeg): Ao usar -ss antes -i no FFmpeg 2.1 e mais recente, a busca é precisa do quadro ao recodificar o vídeo (ou seja, não usar -c copy). Então você não precisa se preocupar em colocar -ss depois de -i para velocidade.


Converter pontos finais em duração

Se você precisar usar uma versão antiga do ffmpeg e não pode usar o -to opção, você pode criar uma lista de edição de pontos de entrada e saída e convertê-los em pontos com duração. Para isso você pode usar este script Ruby Eu escrevi, que calcula a diferença:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

Por exemplo:

time_diff("00:09:23.000", "00:25:33.000")
=> "00:16:10.000" 

207



No ubuntu 12:10, -c: v e -c: a não funcionou. Eu tive que usar "-acodec copy e -vcodec copy" em seu lugar. - Samuel Lampa
@Samuel Então você está usando uma versão desatualizada, que nem é real FFmpeg, mas o garfo de Libav. Vejo: stackoverflow.com/a/9477756/1109017 - slhck
Obrigado por isso! se você não especificar uma duração, ela irá para o final? - Jeff
@Jeff Sim! (personagem mínimo) - slhck
@Prateek Ao copiar o fluxo de bits de vídeo (em vez de re-codificar), você só pode cortar em quadros-chave. Se houver keyframes nos segundos 1, 2 e 3, mas você quiser cortar no segundo 1.5, o ffmpeg esperará até o segundo 2 antes de começar a cortar. Isso torna impreciso. - slhck


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

Dê uma olhada também ffmpeg Docou esta página da wiki.


17



ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile versão mais simples - nwgat
Eu tive que usar ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4 versão (com -copyts), caso contrário, corta 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 endpoints. - Tomasz Gandor
A opção -to responde à pergunta que foi realmente feita. O resto das respostas é impertinente ou obsoleto. - James Bowery


Isso é estranho que ninguém sugeriu 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 ao segundo 58:

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

8



Sim, bom mencionar trim e atrim. Eu costumo usá-los ao filtrar, mas os usuários devem observar que filtragem requer re-codificação. - LordNeckbeard
Você é meu herói. Eu precisava muito de um filtro que fizesse isso. - fahadash


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

Existem duas maneiras de dividir arquivos de vídeo pelo ffmpeg. O primeiro é bom em si mesmo, mais do que isso - é mais rápido, mas às vezes cria arquivos de saída com certas falhas. Então, para esses casos, há a segunda maneira de dividir arquivos de vídeo: é consideravelmente mais lento, os arquivos de saída são maiores, mas parece que eles são sempre do mesmo nível de qualidade que os 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 começo da parte de um vídeo ffmpeg é cortar. Formato: 00:00:00.0000, significando horas: minutos: segundos: milissegundos.

  • <duration> - a duração da parte de um vídeo ffmpeg é cortar. O mesmo formato 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 e 19 minutos e 0 segundos. A duração do corte da sequência de vídeo é de 5 minutos e 0 segundos.


3



Ok, thnx. Vai verificar os documentos e experimentá-lo amanhã. - juGGaKNot
-sameq não significa "mesma qualidade" e foi removido do ffmpeg. Usar -codec copy em vez de. Além disso, não se esqueça do -to opção. - LordNeckbeard
Eu corrigi os comandos da sua cotação, pois eles estavam bastante desatualizados. Por favor, não copie e cole informações sem citá-las corretamente. - slhck


Você pode usar isso

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

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


-1



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


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 de término, mas isso deve funcionar para você.


-2



Por que você está configurando o FFmpeg para recodificar o arquivo? Observe que -sameq não significa "mesma qualidade". - slhck