Rotar videos con FFmpeg [cerrado]
He estado intentando descubrir cómo rotar videos con FFmpeg. Estoy trabajando con vídeos de iPhone tomados en modo retrato. Sé cómo determinar los grados de rotación actuales usando MediaInfo (excelente biblioteca, por cierto), pero ahora estoy atascado en FFmpeg.
Por lo que he leído, lo que necesitas usar es una opción de vfilter . Según lo que veo debería quedar así:
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
Sin embargo, no puedo hacer que esto funcione. Primero, -vfilters ya no existe, ahora es solo -vf . En segundo lugar, aparece este error:
No such filter: 'rotate'
Error opening filters!
Hasta donde yo sé, tengo una versión de FFmpeg con todas las opciones. Al ejecutar ffmpeg -filters se muestra esto:
Filters:
anull Pass the source unchanged to the output.
aspect Set the frame aspect ratio.
crop Crop the input video to x:y:width:height.
fifo Buffer input images and send them when they are requested.
format Convert the input video to one of the specified pixel formats.
hflip Horizontally flip the input video.
noformat Force libavfilter not to use any of the specified pixel formats
for the input to the next filter.
null Pass the source unchanged to the output.
pad Pad input image to width:height[:x:y[:color]] (default x and y:
0, default color: black).
pixdesctest Test pixel format definitions.
pixelaspect Set the pixel aspect ratio.
scale Scale the input video to width:height size and/or convert the i
mage format.
slicify Pass the images of input video on to next video filter as multi
ple slices.
unsharp Sharpen or blur the input video.
vflip Flip the input video vertically.
buffer Buffer video frames, and make them accessible to the filterchai
n.
color Provide an uniformly colored input, syntax is: [color[:size[:ra
te]]]
nullsrc Null video source, never return images.
nullsink Do absolutely nothing with the input video.
Tener las opciones para vflip y hflip es genial y todo eso, pero simplemente no me llevarán a donde necesito ir. Necesito poder rotar videos 90 grados como mínimo. 270 grados también sería una excelente opción. ¿A dónde se han ido las opciones de rotación?
Girar 90 en el sentido de las agujas del reloj:
ffmpeg -i in.mov -vf "transpose=1" out.mov
Para el parámetro de transposición puedes pasar:
0 = 90° counterclockwise and vertical flip (default)
1 = 90° clockwise
2 = 90° counterclockwise
3 = 90° clockwise and vertical flip
Úselo -vf "transpose=2,transpose=2"
para 180 grados.
Asegúrese de utilizar una versión reciente de FFmpeg desde aquí (una compilación estática funcionará bien).
Tenga en cuenta que esto volverá a codificar las partes de audio y video . Generalmente puedes copiar el audio sin tocarlo, usando -c:a copy
. Para cambiar la calidad del video, configure la tasa de bits (por ejemplo con -b:v 1M
) o consulte la guía de codificación H.264 si desea opciones de VBR.
Una solución también es utilizar este práctico script .
Si no desea volver a codificar su video y su reproductor puede manejar metadatos de rotación, puede simplemente cambiar la rotación en los metadatos usando FFmpeg con la bandera con display_rotation
los valores 0
, y 90
:180
270
ffmpeg -display_rotation 90 -i input.mp4 -codec copy output.mp4
Las versiones anteriores de FFmpeg que no admiten el indicador display_rotation
pueden modificar los metada usando estos indicadores:
ffmpeg -i input.mp4 -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.mp4
Usar transpose
. Me gusta (de la otra respuesta):
ffmpeg -i input -vf transpose=2 output
Si está utilizando una versión anterior, debe actualizar FFmpeg si desea utilizar la función de transposición, tal como se agregó en octubre de 2011.
La página de descarga de FFmpeg ofrece compilaciones estáticas que puede ejecutar directamente sin tener que compilarlas.
Para rotar la imagen en el sentido de las agujas del reloj puedes usar el filtro de rotación, que indica un ángulo positivo en radianes. Con 90 grados igual a π /2, puedes hacerlo así:
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
Para el sentido contrario a las agujas del reloj, el ángulo debe ser negativo.
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
El filtro de transposición funcionará igualmente bien para 90 grados, pero para otros ángulos esta es la única opción o la más rápida.
Encontré esta página mientras buscaba la misma respuesta. Han pasado seis meses desde que se solicitó esto originalmente y las compilaciones se han actualizado muchas veces desde entonces. Sin embargo, quería agregar una respuesta para cualquiera que venga aquí buscando esta información.
Estoy usando Debian 6.0 (Squeeze) y la versión FFmpeg de esos repositorios.
La página de manual de FFmpeg establece el siguiente uso:
ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg
La clave es que no debe utilizar una variable de grado, sino una variable de configuración predefinida de la página de manual.
0=90CounterCLockwise and Vertical Flip (default)
1=90Clockwise
2=90CounterClockwise
3=90Clockwise and Vertical Flip