Tengo un video HD de un orador dando una conferencia. Me gustaría cambiar el tamaño del video recortando cada fotograma, pero el rectángulo de recorte debe centrarse en la cabeza del orador mientras se mueve por el escenario.
Yo puedo generar un archivo que contiene X del rectángulo de recorte, y, ancho, y altura para cada fotograma del vídeo.
¿Cuál es la mejor manera de aplicar este recorte en movimiento al video?
Debería funcionar si yo ...
- Use ffmpeg para extraer cada cuadro a una carpeta
- Use otro programa para recortar cada archivo de imagen
- Use ffmpeg para reconstruir el video usando los archivos de imagen recortados
¿Hay una mejor manera de hacer esto?
Respuestas:
Similar a la respuesta de superposición de Gyan, una versión un poco más simple puede usar un -filter_script básico con los filtros "swaprect" y "crop". Mueva el objetivo de recorte a 0,0 y luego recorte el área objetivo a 0,0. El objetivo debe intercambiarse a 0,0, de lo contrario, el otro rect intercambiado puede superponerse. Esto funcionó con ffmpeg versión 3.4.6-0ubuntu0.18.04.1
Asegúrese de que los números de fotograma sean relativos al desplazamiento pasado con "-ss".
Un ejemplo dirigido a cultivos de 1280x720 de una fuente de 4096x2160. La fuente es de 24 fps y la información de seguimiento es de 8 fps.
recorte-filtro-script:
ffmpeg -ss [start offset] -t [duration] -i input.mov -filter_script:v:0 crop-filter-script -acodec copy out.mov
fuente
Ya he cambiado a
avconv
, así que me disculpo si la respuesta puede ser un poco diferente en el clásico ffmpeg, pero creo que no debería haber mucha diferencia.Puede tener un recorte en movimiento si puede crear algún tipo de fórmula entre el número de cuadro y la posición del recorte; pero no hay herramientas analíticas disponibles para hacer eso. Esto significa que si el hablante se mueve de una manera predecible, teóricamente podría hacerlo sin una aplicación externa.
Supongamos, por ejemplo, que el altavoz se mueve de arriba a la izquierda a abajo a la derecha en la imagen. Podrías hacer algo en la línea de:
Aquí me estoy moviendo 1 píxel por cuadro, lo cual es muy poco probable como alguien se movería.
Tenga en cuenta que la interfaz de filtro de avconv proporciona muchas funciones matemáticas (y estoy seguro de que ffmpeg es similar).
Imaginemos que desea mover 1 píxel por fotograma, pero solo de 200 a 350 fotogramas. Entonces puedes hacer
Para los cuadros <200,
max(n,200)
generaríamos 200, luego quitamos 200 para ponerlo en 0, y luegomin
devolveremos la primera parte hasta 350 cuadros, donde ese resultado sería más de 150 y la constante comenzará a ser devuelta.Aunque escribir tal fórmula a mano sería bastante tedioso, tal vez también sea útil en algunos casos.
Dicho todo esto, si tuviera la opción de tener acceso al software que es capaz de trabajar en imágenes cuadro por cuadro, seguiría esa ruta.
fuente
Como estoy trabajando exactamente en el mismo desafío, actualmente estoy pensando en abusar del filtro ffmpeg vidstabtransform con un archivo trf generado. Pero aún no he resuelto los detalles.
Información sobre el formato de archivo trf.
fuente
Dado que tiene " un archivo que contiene los rectángulos de recorte X, Y, Ancho y Altura para cada cuadro ", puede usar la opción filter_script para hacer esto en FFmpeg. El filtro de recorte no admite la edición de la línea de tiempo, pero el filtro de superposición sí. Por lo tanto, si crea un lienzo en blanco de la misma resolución que su video y luego superpone el video en la parte superior con coordenadas de modo que su región deseada se superponga en el área visible, se logra el objetivo.
La sintaxis básica es
donde se
file.txt
ve así:El lienzo
W
yH
debe ser igual a las dimensiones de recorte (fijo / estático) y de la mismaFPS
. Luego, cada fotograma del video se superpone en ( - X, - Y) para que la esquina superior izquierda de la región deseada esté en (0,0) del lienzo. Cada superposición ocurre para un cuadro. En aras de la eficiencia, si tiene intervalos donde la región de cultivo es estática, debe usar el evaluador intermedio, por ejemploTambién puede evaluar usando la marca
t
de tiempo en lugar del índice de fotograma.fuente