Como concatenar clipes do mesmo vídeo com ffmpeg


15

Eu tenho um vídeo longo com cenas diferentes. Quero extrair e concatenar 2 cenas do vídeo (que não iniciam em um quadro I) usando o ffmpeg 2.1.4.

Para argumentar, digamos que eu queira 5 segundos entre 01:00 e 02:00.

Eu posso fazer isso:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

Isso me dá o filme que eu quero, mas selecionar na verdade força o ffmpeg a decodificar o resto do filme. Então, como eu digo para truncar o primeiro filme em vez de decodificá-lo?

Eu preferiria fazer isso com um filtro complexo ffmpeg, se possível. Sei que posso usar apenas -tpara recodificar filmes separados primeiro, mas a etapa extra de codificação é muito lenta no meu caso e também perde uma boa quantidade de qualidade para este vídeo.

Não consigo encontrar um filtro que trunque o comprimento de um vapor. Existem nós de filtro que correspondem aos parâmetros -tou -ss?

Respostas:


16

filtro concat

Esse método é melhor se você precisar executar uma filtragem adicional:

Use as trim, atrim, setpts, asetpts, e concatfiltros:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptse asetptsimpedirá uma saída irregular devido a problemas de carimbo de data / hora da apresentação.

  • Certifique-se de usar uma versão recente. Consulte a página Download do FFmpeg para obter links para compilações para Windows, OS X e Linux.


concat desmuxer

Outro método é criar os segmentos individualmente e copiá- los em fluxo, em vez de recodificar (para economizar tempo e qualidade), e juntá-los ao desmuxador concat .

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
Ah obrigada. aparar é o que estava faltando. No entanto, leva muito tempo para chegar ao deslocamento especificado, como se estivesse decodificando tudo. Além disso, parte da saída estava sem áudio. Para corrigir, especifiquei a mesma entrada várias vezes com -ss e use trim para truncar o vídeo. Nesse caso, você não precisa de setpts, pois ss define pts como 0. Isso parecia funcionar e não teve pausas aleatórias estranhas durante a codificação. Quanto a copiar fluxos, eu tentei isso antes. Ele começa no quadro I anterior, para que você obtenha uma parte diferente do filme da que você queria.
eliminado 18/03/14

Por favor, responda minha pergunta, é semelhante a esta. video.stackexchange.com/questions/18247/…
Eftekhari:

Curiosamente, -filter_complexfunciona, mas os concatarquivos não - ou seja, o primeiro vídeo parece bom, mas a qualidade do segundo é horrível. Observe que copiei esses comandos exatamente para ambos (exceto para o arquivo de entrada).
bobmarksie

7

Isso deve funcionar mais rápido ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

Não há necessidade de especificar -t na saída. Não há necessidade de dividir o áudio e o vídeo antes da concat.


11
Isso usa o filtro concat que exigirá recodificação. Isso pode ou não ser desejado pelo usuário.
llogan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.