Rotar vídeos mp4 sin volver a codificar


Estoy buscando una manera de rotar videos grabados con mi Nexus 4 en mi sistema Debian Wheezy. Los videos se graban en modo retrato y me gustaría rotarlos al modo horizontal. Preferiblemente la rotación es impulsada por línea de comandos.

He encontrado varias preguntas anteriores que están insinuando una buena solución, pero parece que no puedo lograr que funcione.

Para empezar había esta pregunta: Rotación de vídeos con FFmpeg

Pero indica que ffmpeg es anticuado y que debería usar avconv. Encontré esta pregunta detallando el camino a seguir. https://askubuntu.com/questions/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

Esto me hizo usar el siguiente comando:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

Sin embargo, esto es laboriosamente lento (la última prueba me llevó más de 6 horas por menos de 3 minutos de metraje) y no resulta en una película reproducible. También recibo un error en la salida de registro que indica la tasa de mb > límite de nivel.

Es hay un problema aquí con la re-codificación ? ¿Primero debo volver a codificar los videos de mi teléfono a otra codificación más "viable" antes de aplicar las rotaciones? O me estoy perdiendo otro punto importante ?

Gracias de antemano

Author: Community, 2014-07-30

5 answers

Si solo desea cambiar los metadatos de manera que los mediaplayers que consideren la bandera reproduzcan el archivo girado, intente algo como:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

Como se encuentra en otra parte de stackoverflow.

 82
Author: ruediger05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:58

Rotation=0 solucionó mi problema. Comencé a grabar video en modo retrato, me di cuenta de mi error e inmediatamente puse mi teléfono en horizontal para continuar grabando. Mi iphone había marcado el video como retrato para todo el video.

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

Lo arreglé.

 41
Author: Mangor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-06 19:48:20

FFmpeg y programas similares cambian los metadatos incluso con la opción -map_metadata. exiftool puede leer la matriz de rotación y la bandera de rotación, pero no puede escribirla.

Para obtener verdadero sin pérdidas (incl. metadatos) rotación, no pude encontrar una solución, así que tomé un editor hexadecimal (por ejemplo HxD) y analicé los archivos de vídeo girados.

Verdadera rotación sin pérdida de MP4:

  • abra mp4 con el editor hexadecimal y busque vide para encontrar los metadatos de la pista de vídeo
  • algunas filas arriba (para mis archivos en su mayoría 9, a veces 12) debería ver trak...\tkhd
  • en el medio debe haber un signo @ (hexadecimal 40)
  • en las dos filas anteriores se almacena la matriz de rotación
  • Sin rotación:

    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 180°:

    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 90° cw:

    00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40 
    
  • 90 ° ccw:

    00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40
    

Altere el archivo según lo necesite, y debe girarse en los reproductores que admiten la rotación bandera(la mayoría de los jugadores actuales lo hacen).

En caso de que su video contenga audio estéreo, esto obviamente no se cambia, por lo que en caso de que desee que el sonido coincida con la rotación del video (180°), debe cambiar los canales izquierdo y derecho.

 7
Author: aXeL-HH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 12:48:53

Hay varias cosas que usted ha tocado en su pregunta:

  1. Casi no hay posibilidad de que pueda rotar sin volver a codificar. La excepción a esa regla (códec MJPEG) ya se ha señalado, pero es poco probable que lo esté utilizando, por lo que va más allá del alcance de esta pregunta. Mencionaré que la razón de esta capacidad es que JPEG se puede convertir a través de metadatos. Por lo tanto, si usted será capaz de encontrar un contenedor que tiene la rotación de metadatos, usted será capaz de rotar, pero no existe ninguno (o están suficientemente dispersos) hasta el momento.
  2. Si le tomó horas rotar y volver a codificar 3 minutos del video, entonces el problema puede estar en una enorme resolución. Y quiero decir enorme! Puede por favor proporcionar la salida de la avprobe original.mp4 para que pueda ser averiguado.
  3. Los debates Libav versus FFmpeg son muy contraproducentes (se puede ver que por la cantidad de fud publicado aquí ya). Básicamente lo que ha sucedido fue una división de la proyecto con algunos desarrolladores yendo en una dirección y otros en otra, el hecho de que el proyecto FFmpeg haya logrado mantener el nombre es solo una casualidad y no tiene sentido llamar a un proyecto original y a otro una bifurcación. Las diferencias entre los proyectos están principalmente en el estilo de desarrollo y en la filosofía. Si caracterizara a FFmpeg como más Código Abierto y a Libav como más Software Libre, no estaría tan equivocado. La gente racional espera que eventualmente los desarrolladores entren en razón, y tal vez no fusionar los proyectos, pero cooperar en mayor medida. Cuando Ubuntu salió originalmente, en cada chat de Debian GNU / Linux había mensajes enormes en la línea de " ¡Ubuntu NO es Debian!!!!!!!", pero ahora la situación se ha calmado y ambos lados están bastante contentos el uno con el otro.
 3
Author: v010dya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-09 10:43:25

Esta respuesta es simplemente un resumen de los comentarios proporcionados por LordNeckbeard.

Rotando sin codificación

La rotación sin recodificación no es posible a menos que:

  • su entrada es MJPEG
  • rotas al reproducir

Rotar con codificación usando el ffmpeg

Para entender correctamente los pasos necesarios para esto, uno debe comenzar leyendo o al menos hojeando esta pregunta:

¿cuáles son las diferencias y similitudes entre ffmpeg, libav, y avconv?

Resumen: avconv es una bifurcación de ffmpeg, el mantenedor de debian eligió avconv, tienes que compilar el ffmpeg correcto desde el código fuente.

El siguiente paso sería compilar el ffmpeg correcto desde la fuente como se detalla aquí:

Guía de compilación de ffmpeg para Debian

El paso final es usar los comandos encontrados en otros posts:

Cómo voltear un video 180° (vertical / boca abajo) con FFmpeg? o Rotación de vídeos con FFmpeg

Resumen: ffmpeg-vfilters "rotate = 90" - i input.mp4 output.mp4

 1
Author: stedes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:35