Tengo un video que se rotó 180 ° cuando se grabó. ¿Es posible corregir esto con FFmpeg?
Tengo un video que se rotó 180 ° cuando se grabó. ¿Es posible corregir esto con FFmpeg?
Respuestas:
ffmpeg
rotará automáticamente el video a menos que:
ffmpeg
es demasiado viejoAlgunos 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 ffmpeg
salida 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
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.
ffmpeg -i input.mp4 -c:a copy output.mp4
Para deshabilitar este comportamiento, use la -noautorotate
opción.
ffmpeg
es viejoTendrá 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:
Con el uso, ffmpeg
puede 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 rotate
filtro, la interpolación bilineal debe desactivarse (mediante el uso bilinear=0
) para ángulos divisibles por 90, de lo contrario puede verse borrosa.
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=yuv420p
ya ffmpeg
que intentaré minimizar o evitar el submuestreo de croma (dependiendo del codificador, entrada, ffmpeg
versió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 copy
opció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.
Alternativamente, puede girar durante la reproducción y evitar volver a codificar. ffplay
rotará 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.
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 .
-vf vflip
y funcionó de maravilla. Pero fue una nueva codificación. No estoy seguro si te estoy leyendo bien. ¿Estás diciendo -vf hflip,vflip
que no volverá a codificar?
ffmpeg
requiere que vuelva a codificar cuando use filtros de video y audio. Sin embargo, ffplay
también puede utilizar muchos de los filtros durante la reproducción como se muestra en mi segundo ejemplo.
-codec:v libx264
. ¿Puede ffmpeg
usar la misma codificación sin que el usuario intente resolverlo?
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 -noautorotate
indicador (esto es compatible con versiones anteriores que aún se mantenían en ese momento).
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".
Alternativamente, si desea volver a codificar su video, consulte Rotación de videos con FFmpeg en Stackoverflow.
transpose
filtro al que se hace referencia en videos giratorios con FFmpeg no girará 180 ° por lo que puedo decir.
transpose
filtros para lograr el efecto.
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
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
Aquí están los pasos:
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.
Una vez que el video esté abierto, haga clic en "Editar" y luego encontrará las opciones de rotación y volteo directamente debajo
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).
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.