FFmpeg: possível aplicar filtro a apenas parte de um arquivo de vídeo durante a transcodificação

6

Eu tenho um pequeno clipe de 3:00 min que é girado da esquerda para a direita por aproximadamente: 30 segundos no meio.

Então, se a coisa toda fosse virada da esquerda para a direita, eu gostaria de aplicar:

ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4

Mas como é apenas parcialmente invertido, existe uma maneira, em um único comando ffmpeg, de aplicar um segmento de tempo para esse filtro hflip (1: 30-2: 00)?

Estou procurando alguma documentação sobre isso e não consigo encontrar nada do tipo, estou querendo saber se isso não é possível no FFmpeg ou não.

    
por Roybert Soylend 24.09.2015 / 21:24

2 respostas

10

Como faço para virar apenas uma subseção de um vídeo usando ffmpeg ?

Aqui, -filter_complex é seu amigo, pois pode criar cadeias de entrada filtrada . Ainda estaremos usando o filtro hflip mencionado na pergunta no filtro de filtros.

Você pode se inscrever em uma subseção assim:

ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4

Uma linha para copiar e colar fácil:

ffmpeg  -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4

Explicação:

Usar um filtergraph é um pouco como criar uma cadeia de ações, e há uma boa explicação visual 1 disso no seção" Introdução à filtragem " da documentação de filtros. Os filtros funcionam com entradas - esse é o bit que você vê antes do filtro, por exemplo, [0:v] (vídeo do primeiro fluxo de entrada) ou [a] (uma saída criada chamada a ) - e saídas . Ou seja, uma entrada ou entradas são transformadas de acordo com um filter e, em seguida, saem como saídas de saída ou .

Nós temos um conjunto simples de ações aqui, e se passarmos por aquelas em sequência, podemos construir um filtro gráfico de entradas e saídas.

Segmentos

Crie 3 segmentos de vídeo (da entrada [0:v] ) usando trim :

  • Primeiro segmento (90 segundos), não faça nada (saída como [a] )
  • Segmento secundário (30 segundos), hflip e setpts para evitar problemas de duração (saída de corte como [b] e passar isso para hflip para saída como [c] )

Estes dois são então concat ed juntos para fazer a saída [a]+[c] -> [d] (duração: 120 s)

  • Terceiro segmento (60 segundos), defina PTS novamente (saída como [e] )

Participe dos segmentos para gerar a saída [d] + [e] -> [out1] e -map para a saída final no arquivo.

Isso lhe dá um vídeo com a mesma duração do original (180 s), mas com uma seção de 30 segundos no meio que são invertidos horizontalmente 2 .

1 :

Representação visual de ffmpeg filtros de documentação

In libavfilter, a filter can have multiple inputs and multiple outputs. To illustrate the sorts of things that are possible, we consider the following filtergraph.

                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+

This filtergraph splits the input stream in two streams, then sends one stream through the crop filter and the vflip filter, before merging it back with the other stream by overlaying it on top.

2 Testado usando ffmpeg version N-72939-g5b0f55a

    
por 24.09.2015 / 22:08
5

Ainversãohorizontalocorreentre2a3segundosnesteexemplo.

Vocêpodeusaro filtro geq com o > opção ("edição da linha do tempo"):

ffmpeg example:

ffmpeg -i input -vf "geq='p(W-X,Y)':enable='between(t,90,120)'" -c:a copy output

ffplay example:

ffplay -vf "geq='p(W-X,Y)':enable='between(t,90,120)'" input

Notas:

  • O hflip atualmente não suporta edição de cronograma, por isso é que geq foi usado neste exemplo .

  • Você pode ver quais filtros suportam a edição da linha do tempo com ffmpeg -filters . Um " T " anterior ao nome do filtro indica que ele suporta a edição da linha do tempo.

  • Este exemplo irá transmitir a cópia do áudio, supondo que você deseja simplesmente re-mux em vez de re -code.

por 27.09.2015 / 20:40

Tags