
Tengo un clip corto de 3:00 minutos que solo se voltea de izquierda a derecha durante aproximadamente: 30 segundos en el medio.
Entonces, si todo se volteara de izquierda a derecha, solo me gustaría aplicar:
ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4
Pero dado que solo está invertido parcialmente, ¿hay alguna manera, en un solo comando ffmpeg, de aplicar un segmento de tiempo para ese filtro hflip (1:30-2:00)?
Estoy buscando documentación sobre esto y no puedo encontrar nada por el estilo. Me pregunto si simplemente no es posible en FFmpeg o no.
Respuesta1
¿Cómo puedo invertir solo una subsección de un video usando ffmpeg
?
Aquí,-filter_complex
es tu amigo, ya que puede crear cadenas de entradas filtradas. Seguiremos usando el hflip
filtro mencionado en la pregunta del gráfico de filtros.
Puede postularse a una subsección como esta:
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
Una línea para copiar y pegar fácilmente:
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
Explicación:
Usar un gráfico de filtro es un poco como crear una cadena de acciones, y hay una buena explicación visual 1 de esto en elSección 'Introducción al filtrado'de la documentación de los filtros. Los filtros funcionan conentradas- ese es el bit que ves antes del filtro, por ejemplo [0:v]
(video del primer flujo de entrada) o [a]
(una salida creada llamada a
) - ysalidas. Es decir, unaaporteoentradasse transforman de acuerdo con a filter
y luego se emiten como unproducciónosalidas.
Aquí tenemos un conjunto simple de acciones, y si las realizamos en secuencia podemos construir un gráfico de filtro de entradas y salidas.
Segmentos
Cree 3 segmentos de video (a partir de la entrada [0:v]
) usando trim
:
- Primer segmento (90 segundos), no hacer nada (salida como
[a]
) - Segundo segmento (30 segundos)
hflip
ysetpts
para evitar problemas de duración (generar recorte como[b]
y pasarlohflip
a generar como[c]
)
Luego, estos dos se concat
combinan para generar la salida [a]+[c] -> [d]
(duración: 120 s)
- Tercer segmento (60 segundos), configure PTS nuevamente (salida como
[e]
)
Una los segmentos para generar la salida [d] + [e] -> [out1]
y -map
eso para la salida final en el archivo.
Esto te da un video de la misma duración que el original (180 s), pero con una sección de 30 segundos en el medio que están volteados horizontalmente 2 .
1 :
Representación visual deffmpeg
documentación de filtros
En
libavfilter
, un filtro puede tener múltiples entradas y múltiples salidas. Para ilustrar el tipo de cosas que son posibles, consideramos el siguiente gráfico de filtro.
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
Este gráfico de filtro divide el flujo de entrada en dos flujos, luego envía un flujo a través del filtro de recorte y el filtro vflip, antes de fusionarlo nuevamente con el otro flujo superponiéndolo en la parte superior.
2 Probado usandoffmpeg version N-72939-g5b0f55a
Respuesta2
En este ejemplo, el giro horizontal se produce entre 2 y 3 segundos.
Algunos filtros tienen soporte de línea de tiempo a través delhabilitar opción.
Puede ver una lista de filtros y si tienen soporte de línea de tiempo con ffmpeg -filters
. Un " T
" que precede al nombre del filtro indica que admite la edición de la línea de tiempo. Si el filtro que desea no es compatible con la línea de tiempo, actualícelo, ffmpeg
ya que los filtros a veces se actualizan para admitir esto. De lo contrario, utilice los filtros de recorte como se explica en la otra respuesta.
ffmpeg
ejemplo:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
ejemplo:
ffplay -vf "hflip=enable='between(t,90,120)'" input