
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 hflip
filtro 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 filter
e 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)
hflip
esetpts
para evitar problemas de duração (saia cortada como[b]
e passe parahflip
a saída como[c]
)
Esses dois são então concat
unidos 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 -map
isso 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 deffmpeg
documentaçã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.
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, ffmpeg
pois 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.
ffmpeg
exemplo:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
exemplo:
ffplay -vf "hflip=enable='between(t,90,120)'" input