Corte com precisão arquivos de vídeo da linha de comando

19

Estou tendo problemas para encontrar um aplicativo cli que possa pegar um arquivo de vídeo (avi, mkv e mp4, de preferência) e cortar clipes muito curtos (2-6 segundos) com precisão de tempo de precisão. Eu tentei ffmpeg , mencoder , avidemux e mp4box mas todos eles cortaram em keyframes que criam 6+ segundos clipes. Existe uma ferramenta que recodificará o arquivo de entrada e reduzirá o tempo exato ou o corte de maneira imprecisa, recodificará e depois cortará com precisão?

    
por curmil 07.08.2012 / 20:17

3 respostas

20

Cortando vídeo com ffmpeg

Você pode cortar vídeos com precisão com o FFmpeg. Desde a versão 2.5 é muito fácil. Isso, por exemplo, cortaria 10 segundos, começando em 0 minutos, 3 segundos e 123 milissegundos.

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a aac -strict experimental out.mp4

A posição e a hora podem estar em segundos ou em hh:mm:ss[.xxx] form.

Observe que, nesses exemplos, o vídeo e o áudio serão recodificados usando x264 e < href="https://trac.ffmpeg.org/wiki/Encode/AAC"> codificadores aac .

Você também pode usar -to em vez de -t para especificar o ponto final em vez da duração. Nesse caso, no entanto, -to é equivalente a -t , pois colocando o -ss na frente de -i , o ffmpeg primeiro procurará esse ponto e, em seguida, iniciará a saída.

Veja também a entrada na wiki Buscando .

Corte preciso para as versões ffmpeg anteriores

Se você tem uma versão mais antiga do ffmpeg, então, para uma busca precisa, é necessário colocar o -ss após -i , o que torna o processo de codificação um pouco mais lento, porque o vídeo inteiro precisa ser decodificado primeiro:

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a aac -strict experimental out.mp4

Aqui, -to e -t se comportam de maneira diferente. -t 10 criaria um clipe longo de dez segundos, enquanto -to 10 criaria um clipe com sete segundos de duração.

Copiar fluxo vs. recodificar

Você pode tentar copiar o fluxo de áudio com -c:a copy também. Copiar o fluxo de vídeo pode ser feito com -c:v copy . Pode, no entanto, não funcionar corretamente porque você só pode cortar quadros-chave de vídeo, que não ocorrem com tanta frequência. Em qualquer caso, pode levar a um corte impreciso se você copiar o fluxo de vídeo.

    
por 07.08.2012 / 22:16
0

Como Baodad disse nos comentários (eu posto porque não é fácil encontrar se você ler rapidamente), a melhor abordagem é detectar os codificadores de áudio / vídeo automaticamente pelo ffmpeg, então:

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • inicie @ 00: 05: 17.18
  • input = in.mp4
  • pare @ 00: 06: 29.10
  • output = out.mp4
por 25.08.2015 / 17:49
0

A única ferramenta de linha de comando do Linux que encontrei até agora, que pode cortar no quadro exato (ou, com precisão de quadro), é melt ( sudo apt-get install melt ).

Digamos que você tenha um inputvid.mp4 - primeiro verifique suas configurações de codificação com ffmpeg (aqui, digamos que quero codificá-lo novamente para -f mp4 , mas como o arquivo /dev/null para que a saída seja descartada ; Eu redireciono stderr para que eu possa passar por ele - note no meio, o comando solicita, e você deve responder y com ENTER, então o processo continua e despeja a informação útil; isto é com ffmpeg 3.3.3 no Ubuntu 14 ):

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Ok, para que possamos ver ffmpeg escolhe libx264 e aac codificadores para este vídeo; então podemos inserir isso em melt :

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

.... e melt cortarão a peça entre os quadros 7235 e 7349 em um novo arquivo, cut.mp4 . Em seguida, para verificar se cut.mp4 faz o loop corretamente, use melt novamente para reproduzi-lo duas vezes e reproduzi-lo em uma janela do SDL:

melt cut.mp4 cut.mp4 -consumer sdl

... e aqui está o que ffmpeg vê para este arquivo:

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

As configurações de codificação de vídeo para cut.mp4 parecem ser idênticas a inputvid.mp4 , exceto que a taxa de bits de vídeo mudou de 389 kb / s para 526 kb / s, e também as configurações de codificação de áudio são quase iguais, exceto a taxa de amostragem alterada de 44100 a 48000 Hz; embora isso possa ser regulado com:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

... no entanto, mesmo com isso, a taxa de bits final do vídeo para mim acaba em 337 kb / s. Ainda assim, os cortes funcionam bem (e isso inclui áudio) quando reproduzidos em um loop, então eu acho que isso é de fato preciso em um quadro ...

    
por 26.01.2018 / 03:25