Usando o ffmpeg para cortar o vídeo

265

Estou usando o ffmpeg para cortar uma seção de um arquivo grande como este:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

A parte -ss funciona bem, mas o -t é ignorado. Ele remove corretamente os segundos especificados especificados com -ss , mas continua indo até o final da entrada com a cópia.

Existe uma maneira de usar o ffmpeg para cortar o final de um vídeo sem recodificá-lo?

    
por Neil 06.05.2010 / 16:12

6 respostas

317

Você pode usar a opção -ss para especificar um carimbo de data / hora inicial e a opção -t para especificar a duração da codificação. Os timestamps precisam estar no formato HH:MM:SS.xxx ou em segundos ( s.msec ).

A seguir, os primeiros 30 segundos serão cortados e, em seguida, serão cortados todos os 10 segundos seguintes:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Observe que -t é uma opção de saída e sempre precisa ser especificado após -i .

Algumas dicas:

  • Para versões mais antigas do ffmpeg, se você usar -ss após -i , você terá uma pesquisa mais precisa às custas de uma execução mais lenta. Veja também: Buscando com o FFmpeg
  • Você pode usar -to em vez de -t para especificar o registro de data e hora ao qual deseja recortar. Então, em vez de -i <input> -ss 30 -t 10 , você também pode fazer -i <input> -ss 30 -to 40 para alcançar a mesma coisa.

  • Se o seu ffmpeg não suportar -c ou -to , é provável que esteja muito desatualizado. Compile uma nova versão ou faça o download de uma versão estática de sua página inicial. Não é realmente complicado.

por 15.05.2010 / 02:03
78

Como outras pessoas mencionaram, colocar -ss antes (muito mais rápido) ou depois (mais preciso) -i faz uma grande diferença. A seção "Busca Rápida e Precisa" na página de busca do ffmpeg mostra como obter os dois e eu usei, e isso faz uma grande diferença. Basicamente, você coloca -ss antes e depois de -i , apenas certifique-se de deixar tempo suficiente antes de começar a cortar para ter outro quadro-chave. Exemplo: Se você quiser fazer um clipe de 1 minuto, de 9min0s a 10 min 0s em Video.mp4, você pode fazer isso de forma rápida e precisa usando:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

O primeiro -ss procura rapidamente para (aproximadamente) 8min0sec e, em seguida, o segundo -ss procura com precisão até 9min0sec, e o -t 00:01:00 tira um clipe de 1min0sec.

Observe também este ponto importante da página: "Se você usar -ss com -c:v copy , o fluxo de bits resultante pode acabar sendo instável, não reproduzível ou fora de sincronia com o fluxo de áudio, já que o ffmpeg é forçado a use apenas / split em i-frames. "

Isso significa que você precisa recodificar o vídeo, mesmo que queira apenas copiá-lo ou corre o risco de ficar instável e fora de sincronia. Você poderia tentar apenas -c copy primeiro, mas se o vídeo for ruim, você precisará refazê-lo.

    
por 20.01.2014 / 05:07
18

Descobri que -ss combinado com -c copy resultou em meio segundo de divisão no início.

Para evitar isso, você tem que remover o -c copy (que certamente fará uma transcodificação).

    
por 09.05.2014 / 04:24
13

MANUALMENTE

Abra o arquivo em um media player que irá avançar quadro a quadro e reproduzir um arquivo AVISynth com dados como:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Em seguida, corte com o formato de hora EXACT:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

e

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Agora crie um arquivo txt com os arquivos de vídeo com conteúdo como:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Execute o ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
    
por 04.09.2014 / 07:48
7

Para mim, a opção -t não funcionou, mas -vframes funcionou. Eu prefiro usar #frames , pois prefiro cortar no I-Frames e descobri o GOP para vídeo usando ffprobe .

A linha de comando que funcionou para mim é:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

A propósito, colocar -ss na frente de -i faz uma grande diferença no tempo de execução.

    
por 19.05.2013 / 05:14
3

Assim como no user225366, a opção -t não funciona para vídeos curtos, mas para vídeos mais longos. Para vídeos curtos, parece que -frames: v é melhor. Isso é o que funcionou para mim.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4
A cópia de

-acodec precisa ser adicionada se o vídeo tiver áudio, como mostram as outras respostas.

    
por 08.12.2016 / 12:24