2010-02-05 17 views
5

Estoy jugando con videos h264 cargados con FFmpeg en el iPhone 3GS. El problema es que los videos grabados en orientación "Vertical" tienen una matriz de transformación que les hace mostrar los 90 grados girados en sentido contrario.FFmpeg en iPhone - Modificación de la orientación de video

Por lo que entiendo hasta ahora, solo necesito modificar la matriz de transformación en el átomo 'tkhd'. El problema es que tengo problemas para acceder o modificar estos datos. Revisé la implementación de FFmpeg para:

static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom) 

que muestra claramente cómo se accede a la matriz en avformat pero cuando intento acceder a los bytes de cabecera utilizando las mismas funciones que no estoy recibiendo ningún valores racionales. Incluso si tuviera que extraer la matriz con éxito, no estoy seguro de cómo reemplazarla. FFmpeg tiene funciones para recuperar y agregar al encabezado de la pista, pero no parece que haya nada para reemplazar.

Cualquier ayuda sería muy apreciada.

Gracias, Matt.

+0

¿es esta una llamada en C++ que le dará la información de Matrix? ¿Tienes ejemplos de usar esto? Sé cómo la información de Matrix hace la rotación. Solo necesito saber una forma simple de obtener esa información de la matriz. Espero que esto se traduzca en una implementación de Windows .... Gracias de antemano –

Respuesta

2

El video de retrato grabado en el iPhone 3GS tiene una rotación extraña en el paisaje, y solo quicktime lo reproduce correctamente, los jugadores como VLC reproducen los videos en modo retrato en horizontal porque están codificados de esa manera. Tal vez Apple ha establecido un poco para que quicktime identifique y establezca la orientación correctamente.

Puede usar la opción -vfilters de ffmpeg para rotar el video. Está disponible en la versión r21242. Tienes que parchearlo en tu versión de ffmpeg.

configurar la acumulación mediante el uso de --enable-vfilters

y que puede utilizar la opción:

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

para girar la película de entrada.

+1

Gracias Raj. Sin embargo, estoy haciendo desarrollo con la biblioteca FFmpeg, así que usar ffmpeg como un programa de línea de comando no es una opción. Tengo que encontrar una forma de usar su biblioteca fuente. –

+0

Matthew, @ "Estoy haciendo desarrollo con la biblioteca FFmpeg" ¡Lo sé y el propósito de esta publicación es el mismo! Usted crea argumentos de línea de comando con las opciones como se muestra arriba y lo pasa al método ffmpeg main(). El resto lo hará ffmpeg. Debe incluir el archivo ffmpeg.c en su proyecto y también las bibliotecas estáticas que se crean utilizando el comando de configuración apropiado, que espero que ya esté hecho. –

12

Para aquellos que no pueden obtener la opción de filtro v para trabajar, después de buscar encontré una opción alternativa que funciona para mi construcción:

ffmpeg -i in.avi -vf "transpose=1" out.avi 

esta voltea el vídeo de 90 grados hacia la derecha. ¡Espero que esto ayude a todos los que están en Ubuntu a luchar como yo! :)

+0

esta es la línea de comando para el ffmpeg más nuevo; el año pasado, fue -vfilters "rotar = 90" – Will

2

la película se graba directamente con la orientación de la cámara de hardware. cuando lo enciende, la cámara sigue grabando con la misma orientación y la misma escritura directa en el archivo.

Lo que determina la orientación del video es el Transform matrix

El matrix se ajusta depende de la orientación del iPhone. Y esto es lo que determinará si tiene que rotar el video. Y esa rotación podría ser de 90 grados y podría ser de 180 grados. Depende de la orientación del teléfono.

Después de hacerse una idea de lo que es la matriz y cómo se relaciona con la imagen, podrá determinar la orientación del video.

+0

editar: mi primer comentario fue bajo la suposición de que esta era mi pregunta. La información que proporcioné aquí estaba relacionada con mi comprensión de la matriz de transformación, así como dónde obtener la información en el archivo. Como él estaba preguntando sobre eso, pensé que esta publicación sería pertinente. Disculpa por mi comentario/edición anterior, ya que pensé que esta era mi pregunta. Gracias :) –

3

Acabo de recibir un parche en la rama maestra de GF de FFMPEG que debería ayudarnos a todos a ajustar la orientación del iPhone y la transformación posterior aplicada al archivo .mov que envía.FFMPEG ahora enviará de vuelta en metadatos:

'rotar' = 90,180, o 270 dependiendo de cuántos grados necesita para girar la imagen en el sentido de las agujas del reloj para obtener la rotación verdadera.

+0

¿podría agregar un enlace a su parche? – sghael

+2

http://git.videolan.org/?p=ffmpeg.git;a=commit;h=62d2a75b024bf72e6f3648e33c5bb5baf9018358 –

+0

¿Ese cambio también afecta la metainformación en el video que les dice a los jugadores cómo rotar/transformar el video durante la reproducción. Puede girar un video 180 grados moviéndolo horizontal y verticalmente, pero eso solo cambia a qué reproductores mostrar el video correctamente o incorrectamente. Los jugadores que no respetan la transformación (por ejemplo, Windows Media Player) muestran el video correctamente, pero dado que el video parece tener la transformación incorporada, QuickTime Player ahora reproduce el video recientemente codificado al revés. Para solucionarlo, también deberías usar -map_metadata -1. – spaaarky21

Cuestiones relacionadas