¿Cómo rotar un video 180 ° con FFmpeg?

69

Tengo un video que se rotó 180 ° cuando se grabó. ¿Es posible corregir esto con FFmpeg?

Louis
fuente
¿Está preguntando si puede voltearlo durante una reproducción o volver a codificar con la orientación correcta?
Mxx
@Mxx Estaba pensando en volver a codificar, pero ¿qué quisiste decir durante la reproducción?
Louis
Los reproductores multimedia que usan ffmpeg como decodificador también pueden utilizar todos sus filtros. Vea esta captura de pantalla ffdshow-tryout.sourceforge.net/images/front1.png Filtro "Offset and flip". Ver también stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg
Mxx
Oh bien, genial. Eso funcionaría para mí, pero también quiero compartirlo. Echaré un vistazo a la pregunta SO.
Louis
55
La redacción y el título de esta pregunta es realmente confusa. Voltear un video verticalmente no es lo mismo que rotarlo 180 grados (que es lo mismo que un giro vertical y uno horizontal). Según la respuesta aceptada que estoy editando para especificar la rotación. Actualmente, esto está contaminando los resultados de Google para voltear videos verticalmente con ffmpeg.
Jason C

Respuestas:

102

originalrotado


tl; dr

ffmpeg rotará automáticamente el video a menos que:

  • su entrada no contiene metadatos de rotación
  • tu ffmpeges demasiado viejo

Metadatos de rotación

Algunos videos, como los de los iPhones, no se voltean físicamente, pero contienen datos laterales de matriz de visualización de flujo de video o metadatos rotados. Algunos jugadores ignoran estos metadatos y otros no. Consulte la ffmpegsalida de la consola para ver si su entrada tiene dichos metadatos:

$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees

Rotación automática

ffmpeg rotará físicamente el video automáticamente de acuerdo con los metadatos de rotación de transmisión de video existentes.

Necesita una compilación que incluya commit 1630224, a partir del 2 de mayo de 2015, para poder utilizar la función de autorrotación.

Ejemplo

ffmpeg -i input.mp4 -c:a copy output.mp4

Para deshabilitar este comportamiento, use la -noautorotateopción.


Si la entrada no contiene metadatos o si ffmpeges viejo

Tendrá que usar un filtro para rotar el video, y si existe algún metadato de rotación, deberá eliminarlo como se muestra en los ejemplos a continuación:

Ejemplos

Con el uso, ffmpegpuede elegir entre tres métodos para usar filtros de video para rotar 180 °.

hflip y vflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv

transpose

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

rotate

Este filtro puede rotar a cualquier ángulo arbitrario y usa radianes como una unidad en lugar de grados. Este ejemplo rotará π / 1 radianes, o 180 °:

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

Puedes usar grados en su lugar. Un grado es igual a π / 180 radianes. Entonces, si quieres rotar 45 °:

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

Cuando se usa el rotatefiltro, la interpolación bilineal debe desactivarse (mediante el uso bilinear=0) para ángulos divisibles por 90, de lo contrario puede verse borrosa.


Notas

  • El filtrado requiere codificación. Estos ejemplos hacen salidas de video H.264. Consulte la Guía de codificación de video FFmpeg H.264 para obtener orientación sobre cómo obtener la calidad que desea.

  • Submuestreo de croma. Incluí format=yuv420pya ffmpegque intentaré minimizar o evitar el submuestreo de croma (dependiendo del codificador, entrada, ffmpegversión, etc.). Este es un buen comportamiento en un sentido puramente técnico, pero la mayoría de los jugadores son incompatibles con esquemas de submuestreo de croma más "avanzados". Esto es lo mismo que usar -pix_fmt yuv420, pero está convenientemente ubicado en la cadena de filtros .

  • Copia el audio. La -codec:a copyopción transmitirá copia (re-mux) en lugar de codificar. No hay ninguna razón para volver a codificar el audio si solo desea manipular el video (a menos que desee convertirlo a un formato de audio diferente). Esto ahorrará tiempo ya que la codificación consume mucho tiempo y preservará la calidad del audio.


Girar al reproducir

Alternativamente, puede girar durante la reproducción y evitar volver a codificar. ffplayrotará automáticamente:

ffplay input.mp4

Si no hay datos laterales de la matriz de visualización o metadatos rotados, puede usar filtros:

ffplay -vf "hflip,vflip" -i input.mp4

... o refiérase a su jugador favorito. La mayoría de los jugadores que vale la pena usar, como VLC, tienen esta capacidad.


Consiguiendo ffmpeg

Las versiones anteriores de ffmpeg no incluyen capacidades de filtrado. Consulte la página de descarga de FFmpeg para ver varias opciones, incluidas las compilaciones convenientes para Linux, OS X y Windows, o consulte el Wiki de FFmpeg para obtener guías paso a paso de compilación de ffmpeg .

lema
fuente
Gracias, acabo de intentarlo -vf vflipy funcionó de maravilla. Pero fue una nueva codificación. No estoy seguro si te estoy leyendo bien. ¿Estás diciendo -vf hflip,vflipque no volverá a codificar?
Louis
@Louis ffmpegrequiere que vuelva a codificar cuando use filtros de video y audio. Sin embargo, ffplaytambién puede utilizar muchos de los filtros durante la reproducción como se muestra en mi segundo ejemplo.
llogan
Ah, no noté que era un programa diferente.
Louis
Me pregunto si hay una forma de preservar la calidad del video que no sea -codec:v libx264. ¿Puede ffmpegusar la misma codificación sin que el usuario intente resolverlo?
Sadi
1
@Louis rotateusa radianes como una unidad en lugar de grados. Creo que la gente está más familiarizada con los grados, así que intenté mostrar cómo usar los grados en el ejemplo. Un grado es igual a π / 180 radianes. Entonces, si desea rotar 45 °, simplemente use rotate="45*(PI/180)".
llogan
7

FFMPEG cambió el comportamiento predeterminado para rotar automáticamente las fuentes de video de entrada con metadatos "rotar" en la versión v2.7 en 2015 .

Si sabe que su script o comando nunca se ejecutará en versiones de ffmpeg anteriores a 2.7, la solución más simple es eliminar cualquier rotación personalizada basada en metadatos.

Para otros casos, puede prepararse para el futuro manteniendo su código de rotación personalizado y agregando el -noautorotateindicador (esto es compatible con versiones anteriores que aún se mantenían en ese momento).

Albin
fuente
2

Los reproductores multimedia que usan ffmpeg como decodificador también pueden utilizar todos sus filtros. Vea esta captura de pantalla con el filtro "Desplazamiento y volteo".ingrese la descripción de la imagen aquí

Alternativamente, si desea volver a codificar su video, consulte Rotación de videos con FFmpeg en Stackoverflow.

Mxx
fuente
1
Desafortunadamente, el transposefiltro al que se hace referencia en videos giratorios con FFmpeg no girará 180 ° por lo que puedo decir.
llogan
1
@LordNeckbeard no directamente, pero puedes encadenar dos transposefiltros para lograr el efecto.
evilsoup
1
@evilsoup Ah, sí, no pensé en eso. El razonamiento espacial es difícil; vamos de compras. Siéntase libre de actualizar mi respuesta con un ejemplo.
llogan
1

A continuación se muestra un script bash que generará los archivos con la estructura de directorios en "fixedFiles". Transforma y gira videos de iOS y transcodifica AVI. El script se basa en haber instalado tanto exiftool como ffmpeg .

#!/bin/bash

# rotation of 90 degrees. Will have to concatenate.
#ffmpeg -i <originalfile> -metadata:s:v:0 rotate=0 -vf "transpose=1" <destinationfile>
#/VLC -I dummy -vvv <originalfile> --sout='#transcode{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=<outputfile>}\' vlc://quit

#Allowing blanks in file names
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#Bit Rate
BR=16384

#where to store fixed files
FIXED_FILES_DIR="fixedFiles"
#rm -rf $FIXED_FILES_DIR
mkdir $FIXED_FILES_DIR

# VLC
VLC_START="/Applications/VLC.app/Contents/MacOS/VLC -I dummy -vvv"
VLC_END="vlc://quit"


#############################################
# Processing of MOV in the wrong orientation
for f in `find . -regex '\./.*\.MOV'` 
do
  ROTATION=`exiftool "$f" |grep Rotation|cut -c 35-38`
  SHORT_DIMENSION=`exiftool "$f" |grep "Image Size"|cut -c 39-43|sed 's/x//'`
  BITRATE_INT=`exiftool "$f" |grep "Avg Bitrate"|cut -c 35-38|sed 's/\..*//'`
  echo Short dimension [$SHORT_DIMENSION] $BITRATE_INT

  if test "$ROTATION" != ""; then
    DEST=$(dirname ${f})
    echo "Processing $f with rotation $ROTATION in directory $DEST"
    mkdir -p $FIXED_FILES_DIR/"$DEST"

    if test "$ROTATION" == "0"; then
      cp "$f" "$FIXED_FILES_DIR/$f"

    elif test "$ROTATION" == "180"; then
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{vfilter={rotate{angle=-"$ROTATION"}},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      $(eval ffmpeg -i \"$f\" -vf hflip,vflip -r 30 -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\")

    elif test "$ROTATION" == "270"; then
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=2,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    else
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{scale=1,width=$SHORT_DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT_DIMENSION,height=$SHORT_DIMENSION}:rotate{angle=-"$ROTATION"}}}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      echo ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" 
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    fi

  fi

echo 
echo ==================================================================
sleep 1
done

#############################################
# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in `find . -regex '\./.*\.AVI'` 
do
  DEST=$(dirname ${f})
  DEST_FILE=`echo "$f" | sed 's/.AVI/.MOV/'`
  mkdir -p $FIXED_FILES_DIR/"$DEST"
  echo "Processing $f in directory $DEST"
  $(eval ffmpeg -i \"$f\" -r 20 -acodec libvo_aacenc -b:a 128k -vcodec mpeg4 -b:v 8M -flags +aic+mv4 \"$FIXED_FILES_DIR/$DEST_FILE\" )
echo 
echo ==================================================================

done

IFS=$SAVEIFS
David Costa Faidella
fuente
1

Me pidieron que editara esto, que introdujera el texto, indicando que la solución que finalmente encontré estaba al final del texto. Entonces, al final, encontrarás los dos comandos ffmpeg consecutivos que rotaron con éxito mi video a la orientación correcta. El texto anterior pretendía proporcionar tanta información como pude, ya que había visto otros mensajes que fueron rechazados por falta de información. De todos modos, espero que esto ayude a otros a usar ffmpeg. Me parece que el propósito de hflip y vflip en ffmpeg es, como mínimo, confuso y contrario a lo que esperaba.

El archivo merlin.mov es una copia de un video que grabé en mi iphone, primero cargué en Dropbox, luego descargué en mi computadora portátil, ejecutando Ubuntu:

    $ uname -a
    Linux gazelle 3.13.0-135-generic #184-Ubuntu SMP
    Wed Oct 18 11:55:51 UTC 2017 x86_64 x86_64 x86_64
    GNU/Linux

Sé que debería haber podido montar mi iPhone a través de USB y copiar los archivos directamente, pero eso no funcionó; mi computadora portátil reconocería que el iPhone estaba conectado, pero no montaría su sistema de archivos, y no recibí ningún mensaje en mi iPhone para "confiar" en la computadora portátil.

El comando que solía copiar de Dropbox a mi computadora portátil era este:

    cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
            merlin.mov

El archivo original es Video 1920 x 1080 Codec HEVC / H.265 Framerate 30 / sec, Bitrate 8140 kbps, Audio Codec MPEG-4 AAC Canales de audio estéreo, Velocidad de muestreo 44100 Hz, Bitrate 85 kbps. Cuando lo juego en mi iPhone, está orientado correctamente y el sonido está sincronizado. Cuando lo reproduzco en Videos en mi computadora portátil, está al revés y se invierte horizontalmente, y el sonido no está sincronizado. Aquí hay una salida parcial de "ffmpeg -i merlin.mov":

    Metadata:
    rotate          : 180
    creation_time   : 2017-11-02T14:41:55.000000Z
    handler_name    : Core Media Data Handler
    encoder         : HEVC

Aquí está la primera línea de salida de "ffmpeg -version":

ffmpeg versión 3.3.3 Copyright (c) 2000-2017 los desarrolladores de FFmpeg

Lo siguiente dejó la reproducción invertida tanto vertical como horizontalmente, aunque se convirtió a video MPEG-4 (video / mp4) y sincronizó el sonido:

    ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4

Lo siguiente se invirtió verticalmente para que la reproducción esté en posición vertical, sincronizó el sonido y se convirtió a MPEG-4, pero dejó el extremo invertido horizontalmente de extremo a extremo (esto no es un error tipográfico, especifiqué 'hflip'):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4

Lo siguiente volteó la horizontal a la orientación correcta, pero dejó la reproducción al revés:

    ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4

Lo siguiente parecía no tener ningún efecto:

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4

También probé esto, basado en un comando que encontré en superuser.com. Sincronizó con éxito el sonido y lo convirtió a MPEG-4, pero la orientación horizontal y vertical permaneció incorrecta:

    ffmpeg -i merlin.mov \
            -vf "rotate=PI:bilinear=0,format=yuv420p" \
            -metadata:s:v rotate=0 -codec:v libx264 \
            -codec:a copy merlinrotate.mp4

También probé esto, que tampoco funcionó en términos de corregir la orientación:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

El siguiente proceso de 2 pasos finalmente obtuvo lo que quería; tanto vertical como horizontal, volteado, sonido sincronizado y formato convertido a MPEG-4 (Nuevamente, esto no es un error tipográfico; utilicé hflip en ambos comandos):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
Thomas Smith
fuente
Si bien es largo, esto me parece una respuesta, simplemente ha recorrido su proceso de resolución de problemas.
Journeyman Geek
@JourneymanGeek De hecho, tienes razón. Ahora veo en su párrafo final. El siguiente proceso de 2 pasos finalmente obtuvo lo que quería . Buen ojo. (Realmente leí toda la publicación, pero mis ojos probablemente ya estaban vidriosos cuando llegué allí).
Digo reinstalar a Mónica el
Buen trabajo mejorando tu respuesta. Has hecho bien en incluir suficientes detalles para tu respuesta. Mientras observa el sitio, intente observar cómo otras buenas respuestas equilibran la claridad con los detalles.
Digo reinstalar a Mónica el
0

Aquí están los pasos:

  1. Primero abra su archivo de video en QuickTime. Puede iniciar QuickTime primero, vaya a "Archivo" y luego a "Abrir archivo". O bien, puede hacer clic con el botón derecho en el archivo, elegir "Abrir con" y luego elegir QuickTime.

  2. Una vez que el video esté abierto, haga clic en "Editar" y luego encontrará las opciones de rotación y volteo directamente debajo

  3. Una vez que haya bloqueado la orientación que desea, debe exportar su video con los nuevos cambios que ha agregado. Encontrará la opción "Exportar" en el menú "Archivo" en QuickTime.

Elija la configuración de archivo que desea exportar y haga clic en "Aceptar" para iniciar la exportación.

Cuando se complete la operación de exportación, ¡encontrará su nuevo archivo donde elija guardarlo con la orientación correcta!

Esta solución completa me llevó menos de 5 minutos en completarse, pero dependiendo de la duración del video, podría tomar mucho más tiempo (o más corto, nuevamente, varía).

fuente del blog

Philippe Matray
fuente
0
ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

Hizo el truco para mí. No estoy seguro de por qué el filtro de transposición no ofrece la posibilidad de girar 180 grados a la vez, sino lo que sea. Consulte los documentos para obtener más información.

panepetero
fuente