Questão Usando ffmpeg para cortar vídeo


Eu estou usando 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

o -ss parte funciona bem, mas o -t é ignorado. Ele remove corretamente os segundos especificados especificados com -ss mas depois continua 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?


249


origem


esta sintaxe está correta. - jiggunjer
stackoverflow.com/questions/18444194/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respostas:


Você pode usar o -ss opção para especificar um timestamp de início e -t opção para especificar a duração da codificação. Os timestamps precisam estar em HH:MM:SS.xxx formato ou em segundos (s.msec).

O seguinte recortaria os primeiros 30 segundos e depois recortaria tudo que é 10 segundos depois disso:

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 especificada depois de  -i.

Algumas dicas:

  • Para versões mais antigas do ffmpeg, se você usar -ss depois de -i, você obtém uma busca mais precisa às custas de uma execução mais lenta. Veja também: Procurando com FFmpeg
  • Você pode usar -to ao invés de -t para especificar o registro de data e hora para o qual você deseja cortar. Então, ao invés de -i <input> -ss 30 -t 10 você também pode fazer -i <input> -ss 30 -to 40 para conseguir a mesma coisa.

  • Se o seu ffmpeg não suporta -cou -to, é provável que esteja muito desatualizado. Compile uma nova versão você ou baixar uma compilação estática da sua página inicial. Não é realmente complicado.


301



@ Mondain Na verdade, você obtém mais precisão colocando o -ss depois. E slhck menciona isso aqui blog.superuser.com/2012/02/24/…  também na documentação do ffmpeg para -ss ele menciona a diferença entre colocá-lo antes ou depois. - barlop
Eu vim aqui para descobrir como ignorar tudo após os primeiros 35 segundos, obrigado: ffmpeg -i input.wmv -c copy -t 35 output.wmv - karlphillip
Isso não funciona para mim (mp4). Apenas produz uma tela preta de 5 segundos: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
Isso produziu tela preta 3-4 s no início do meu clipe de vídeo. Modificação de Chris omitindo -c copy removido a tela preta inicial, veja sua resposta para detalhes. - Joel Ostblom
Você escreve "O seguinte cortaria os primeiros 30 segundos e, em seguida, cortaria tudo o que é 10 segundos depois disso:" <- O que isso significa? Por clipe você quer dizer incluir? Porque clipe pode significar clipe. Assumindo que você quer dizer incluir. Você quer dizer Iniciar a partir de 30 segundos e incluir apenas 10 segundos de lá? Se sim, sugiro que escreva que seria muito mais claro. - barlop


Como outras pessoas mencionaram, colocando -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 do -i, 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 9 min a 10 min a 0 segundo 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 depois o segundo -ss procura com precisão para 9min0sec, e -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 usar somente / split em quadros i. "

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


69



o mesmo aviso se aplica a -c:a copy por este caminho de busca. - jiggunjer
A melhor resposta, desta maneira, funcionou melhor para mim. - Ondra Žižka


eu achei aquilo -ss combinado com -c copy resultou em meio segundo chop no início.

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


16



Há outra resposta que trata da precisão. Recodificar com a opção padrão geralmente NÃO é o que você deseja fazer! - Tomasz Gandor
Bom ponto @ TomaszGandor - Chris


MANUALMENTE

Abra o arquivo em um media player que irá enquadrar por quadro antecipadamente e 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 faça 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"

12





Para mim -t opção não funcionou, mas -vframes trabalhado. Eu prefiro usar #frames, desde que eu prefiro cortar no I-Frames e eu descobri 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

By the way, colocando -ss na frente de -i faz uma grande diferença no tempo de execução.


7



Na realidade -vframes (ou -frames:v) deve vir depois -i porque é uma opção de saída. - slhck


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. Isto é o que funcionou para mim.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

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


1