Explicação:

Explicação:

Eu tenho um clipe curto de 3:00 minutos que só é virado da esquerda para a direita por cerca de 30 segundos no meio.

Então, se tudo fosse virado da esquerda para a direita, eu gostaria apenas de aplicar:

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

Mas como está 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 me perguntando se isso simplesmente não é possível no FFmpeg ou não.

Responder1

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 entradas filtradas. Ainda usaremos o hflipfiltro mencionado na pergunta do filtergraph.

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 facilmente:

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 noSeção 'Introdução à filtragem'da documentação dos filtros. Os filtros funcionam comentradas- 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) - esaídas. Quer dizer, umentradaouentradassão transformados de acordo com a filtere então gerados como umsaídaousaídas.

Temos um conjunto simples de ações aqui e, se as executarmos em sequência, podemos construir um gráfico de filtro 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 para (saída como [a])
  • Segundo segmento (30 segundos) hflipe setptspara evitar problemas de duração (saia cortada como [b]e passe para hflipa saída como [c])

Esses dois são então concatunidos para produzir a saída [a]+[c] -> [d](duração: 120 s)

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

Junte segmentos para gerar a saída [d] + [e] -> [out1]e -mapisso 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 é invertida horizontalmente 2 .


1 :

Representação visual deffmpegdocumentação de filtros

Em libavfilter, um filtro pode ter múltiplas entradas e múltiplas saídas. Para ilustrar o tipo de coisas que são possíveis, consideramos o seguinte filtro gráfico.

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

Este filtergraph divide o fluxo de entrada em dois fluxos e, em seguida, envia um fluxo através do filtro de corte e do filtro vflip, antes de mesclá-lo novamente com o outro fluxo, sobrepondo-o na parte superior.


2 Testado usandoffmpeg version N-72939-g5b0f55a

Responder2

A inversão horizontal ocorre entre 2 a 3 segundos neste exemplo.
A inversão horizontal ocorre entre 2 a 3 segundos neste exemplo.

Alguns filtros têm suporte para linha do tempo por meio doativar opção.

Você pode ver uma lista de filtros e se eles têm suporte para linha do tempo com arquivos ffmpeg -filters. Um " T" precedendo o nome do filtro indica que ele suporta edição na linha do tempo. Se o filtro desejado não tiver suporte para linha do tempo, atualize-o, ffmpegpois os filtros às vezes são atualizados para oferecer suporte a isso. Caso contrário, use os filtros de corte conforme explicado na outra resposta.

ffmpegexemplo:

ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output

ffplayexemplo:

ffplay -vf "hflip=enable='between(t,90,120)'" input

informação relacionada