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

121

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

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

    
por x74x61 11.01.2012 / 18:59

6 respostas

216

Instalar o ffmpeg

Certifique-se de fazer o download de uma versão recente do ffmpeg e não use o que vem com a sua distribuição ( eg Ubuntu). Versões empacotadas de várias distribuições são geralmente desatualizadas e não se comportam como esperado.

Ou compile você mesmo .

Como cortar um vídeo sem recodificar

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 a hora de início, por ex. 00:01:23.000 ou 83 (em segundos)
  • -t especifica a duração do clipe (mesmo formato).
  • O ffmpeg recente também tem um sinalizador para fornecer o horário de término com -to .
  • -c copy copia o primeiro bitstream de vídeo, áudio e legenda da entrada para o arquivo de saída sem codificando-os. 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 implícita em -ss , e somente então ele 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 a opção -c copy , 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 o 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 Buscando com o FFmpeg ): Ao usar -ss antes de -i no FFmpeg 2.1 e mais recente, A busca é precisa de frame ao recodificar o vídeo (ou seja, não usar -c copy ). Então você não precisa se preocupar em colocar -ss após -i para velocidade.

Convertendo pontos finais para duração

Se você precisar usar uma versão antiga de ffmpeg e não puder usar a opção -to , poderá 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 que 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" 
    
por 11.01.2012 / 22:02
18

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 no ffmpeg Doc ou esta página da wiki .

    
por 07.05.2015 / 04:30
8

É 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 ao segundo 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT
    
por 07.04.2015 / 17:10
3

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

There are two ways how to split video files by ffmpeg. The first one is good in itself, more than that - it is faster, but sometimes creates output files with certain flaws. So for those cases there is the second way of splitting video files: it is considerably slower, the output files are bigger, but it seems they are always of the same quality level as input files used.

Way 1:

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

Way 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start> – the beginning of the part of a video ffmpeg is to cut out. Format: 00:00:00.0000, meaning hours:minutes:seconds:milliseconds.

  • <duration> – the duration of the part of a video ffmpeg is to cut out. Same format as above.

Examples:

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

ffmpeg cuts out a part of the video file starting from 1 hour 19 minutes 0 seconds. The duration of the video sequence cut out is 5 minutes 0 seconds.

    
por 03.10.2013 / 21:08
-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

    
por 11.01.2012 / 19:29
-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 de término, mas isso deve funcionar para você.

    
por 11.01.2012 / 19:27