
Tengo un vídeo que se origina en un teléfono y que se reproduce sin problemas en un televisor Thomson (a través de USB). El detalle del vídeo es el siguiente:
> avprobe 20170904_065655.mp4
avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20170904_065655.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2017-09-04 04:58:01
Duration: 00:01:05.34, start: 0.000000, bitrate: 17094 kb/s
Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080, 17017 kb/s, 30 fps, 90k tbn (default)
Metadata:
creation_time : 2017-09-04 04:58:01
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2017-09-04 04:58:01
# avprobe output
El vídeo se gira 90 en sentido antihorario. Por tanto, como señalaaquí, estoy intentando la siguiente línea de comando para rotar el video 90 grados en el sentido de las agujas del reloj:
ffmpeg -i 20170904_065655.mp4 -vf "transpose=1" test.mp4
que, desafortunadamente, rota el vídeo180grados. ¿Hay algún problema con ese comando para rotar el video?
De todos modos, pude rotar el video usando avidemux
, pero el nuevo archivo de video guardado ( rotated.mp4
) no se podía reproducir en el televisor ("Formato de video no compatible"). Intenté convertir el archivo a diferentes formatos usando comandos como
avconv -i rotated.mp4 -c:v h264 -q:v 3 -c:a libmp3lame out.avi
avconv -i rotated.mp4 -c:v mpeg1video -q:v 3 -c:a libmp3lame out.avi
avconv -i rotated.mp4 -r 25 -vb 20M -crf 20 output.avi
avconv -i rotated.mp4 -vcodec libx264 -acodec aac -strict -2 -b:a 384k output.mp4
Pero NADA de eso funcionó. ¿Qué me estoy perdiendo? ¿O hay alguna manera de rotar el video en la línea de comando sin cambiar el formato/codificación real?
el avprobe
de rotated.mp4
es
avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, avi, from 'rotated.mp4':
Duration: 00:00:30.77, start: 0.000000, bitrate: 6728 kb/s
Stream #0.0: Video: h264 (High), yuv420p, 1080x1920 [PAR 1:1 DAR 9:16], 30 fps, 30.02 tbn, 60.04 tbc
Stream #0.1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Usando el ffmpeg deaquí el avprobe
resultado es el siguiente, después de haber aplicado el método de 'Lordneckbeard' a rotated.mp4
:
avprobe version 11.3-6:11.3-1~trusty, Copyright (c) 2007-2014 the Libav developers
built on Apr 13 2015 22:25:55 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.82.104
Duration: 00:00:30.86, start: 0.000000, bitrate: 10397 kb/s
Stream #0.0(und): Video: h264 (Constrained Baseline), yuv420p, 1080x1920 [PAR 1:1 DAR 9:16], 8860 kb/s, 30 fps, 15360 tbn, 60 tbc (default)
Stream #0.1(und): Audio: [1][0][0][0] / 0x0001, 48000 Hz, 2 channels (default)
Unsupported codec with id 0 for input stream 1
# avprobe output
y ni el audio ni el video son compatibles ahora...
Respuesta1
ffmpeg -i input.mp4 -vf "scale=-2:1080,format=yuv420p" -c:a copy output.mp4
Debido a que el televisor parece ignorar los datos laterales de rotación, tendrás que volver a codificar el video para rotarlo.
ffmpeg
hará esto automáticamente, por lo que no tienes que hacer nada especial.Si aún no funciona, agréguelo
-profile:v baseline
para mayor compatibilidad. Recomiendo también probar-profile:v main
y omitir-profile:v
. Si puedes salirte con la tuya, evítalo-profile:v
, lo siguiente mejor esprincipal, menos óptimo esbase, pero en realidad no importa mucho para la reproducción de TV local: lo que funcione es mejor.ElescalaEl filtro reducirá la escala del video para que la altura sea 1080; de lo contrario, no reproducirá un video de tamaño 1080x1920.
Utilizando elformatoEl filtro garantizará un formato de píxel compatible. Su entrada ya es plana YUV 4:2:0, pero esto es sólo un seguro para otros tipos de entrada.
-c:a copy
se agregó para transmitir la copia (re-mux) del audio para evitar una recodificación innecesaria. Para entradas que contienen audio que no sea AAC, utilice-c:a aac
en lugar de-c:a copy
.Los televisores pueden ser exigentes, por lo que esto puede requerir más experimentación. Para probar rápidamente un segmento corto de 60 segundos, puede agregar
-t 60
.desde elffmpegSe usó la etiqueta. Supuse que lo permitiría, es una alternativa aceptable a
avconv
. Es posible que nada de esto se apliqueavconv
porque no lo uso y no estoy familiarizado con él. Asegúrese de utilizar una versión reciente deffmpeg
. Para Linux puedes descargar una versión recienteffmpeg
enhttps://www.johnvansickle.com/ffmpeg/
Respuesta2
Es posible que el video rotado exceda las capacidades de su televisor.
La rotación cambió la resolución de 1920x1080 a 1080x1920.
Si su televisor es 1080p (full HD), admite 1.920x1.080, y si solo es 720p, entonces 1.280x720.
En ambos casos, la altura del vídeo es superior al máximo. Necesitarías un televisor de 2K o 4K para ver ese vídeo.