iphone ruby-on-rails ruby iphone-sdk-3.0 ffmpeg

iphone - ¿Cómo extraer información de orientación de los videos?



ruby-on-rails ruby (6)

He extraído en iOS utilizando AVAssetExportSession, AVMutableComposition y el formulario preferido de entrada AVAssetTrack. Concatenaré la transformación preferida con una transformación para completar el tamaño objetivo.

Después de exportar a un archivo, subo con ASIHTTPRequest a mi servidor de rieles y envío los datos a Amazon S3 con un clip.

Después de navegar a través de toneladas de documentación en la web, parece que el iPhone siempre graba el video con una relación de aspecto de 480x360 y aplica una matriz de transformación en la pista de video. (480x360 puede cambiar pero siempre es lo mismo para un dispositivo dado)

Aquí hay una forma de modificar la fuente ffmpeg dentro de un proyecto de iOS y acceder a la matriz http://www.seqoy.com/correct-orientation-for-iphone-recorded-movies-with-ffmpeg/

Esta es una forma más limpia de encontrar la matriz de transformación en iOS-4 Cómo detectar (iPhone SDK) si un archivo de video se grabó en orientación vertical o horizontal.

¿Cómo se puede extraer la orientación del video en cualquiera de las siguientes opciones?
- iOS 3.2
- ffmpeg (a través del lado del servidor de línea de comandos)
- rubí

Cualquier ayuda será apreciada.


Por lo que he encontrado hasta ahora, ffmpeg no tiene la capacidad de detectar la orientación del iPhone. Pero, la biblioteca de código abierto, mediainfo puede. Un ejemplo de línea de comando:

$ mediainfo test.mp4 | grep Rotation Rotation : 90°

Más salida de ejemplo del mismo video de iPhone:

Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : [email protected] Format settings, CABAC : No Format settings, ReFrames : 1 frame Codec ID : avc1 Codec ID/Info : Advanced Video Coding Duration : 7s 941ms Bit rate mode : Variable Bit rate : 724 Kbps Width : 480 pixels Height : 360 pixels Display aspect ratio : 4:3 Rotation : 90° Frame rate mode : Variable Frame rate : 29.970 fps Minimum frame rate : 28.571 fps Maximum frame rate : 31.579 fps Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.140 Stream size : 702 KiB (91%) Title : Core Media Video Encoded date : UTC 2011-06-22 15:58:25 Tagged date : UTC 2011-06-22 15:58:34 Color primaries : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M Transfer characteristics : BT.709-5, BT.1361 Matrix coefficients : BT.601-6 525, BT.1358 525, BT.1700 NTSC, SMPTE 170M


Puedes usar ffprobe . No es necesario ningún grep , ni ningún otro proceso adicional, ni ninguna operación de expresión regular para analizar la salida como se muestra en otras respuestas.

Si quieres los metadatos de rotación:

Mando:

ffprobe -loglevel error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1:nk=1 input.mp4

Ejemplo de salida:

90

Si desea visualizar los datos laterales de rotación de la matriz:

Mando:

ffprobe -loglevel error -select_streams v:0 -show_entries side_data=rotation -of default=nw=1:nk=1 input.mp4

Ejemplo de salida:

-90

Si quieres la matriz de visualización:

Mando:

ffprobe -loglevel error -select_streams v:0 -show_entries side_data=displaymatrix -of default=nw=1:nk=1 input.mp4

Ejemplo de salida:

00000000: 0 65536 0 00000001: -65536 0 0 00000002: 15728640 0 1073741824

Que significan las opciones

  • -loglevel error Omita el encabezado y otra información de la salida.

  • -select_streams v:0 Solo procesa la primera transmisión de video e ignora todo lo demás. Útil si su entrada contiene múltiples transmisiones de video y solo quiere información de una.

  • -show_entries stream_tags=rotate desde el flujo de video.

  • -of default=nw=1:nk=1 Use el formato de salida predeterminado , pero omita la inclusión de las envolturas de encabezado / pie de página de la sección y cada clave de campo.

Formato de salida

La salida de ffprobe se puede formatear de varias maneras . Por ejemplo, JSON:

ffprobe -loglevel error -show_entries stream_tags=rotate -of json input.mp4 { "streams": [ { "tags": { "rotate": "90" }, "side_data_list": [ { } ] } ]


Similar a la respuesta de @ HdN8, pero sin la expresión regular de python:

$ ffprobe -show_streams any.MOV 2>/dev/null | grep rotate TAG:rotate=180

O JSON:

$ ffprobe -of json -show_streams IMG_8738.MOV 2>/dev/null | grep rotate "rotate": "180",

O puedes analizar el JSON (u otro formato de salida).


ffmpeg informa los metadatos con el valor de rotación para los archivos .mov:

ffmpeg -i myrotatedMOV.mov

....

Duration: 00:00:14.31, start: 0.000000, bitrate: 778 kb/s Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 480x360, 702 kb/s, 29.98 fps, 30 tbr, 600 tbn, 1200 tbc Metadata: rotate : 180 creation_time : 2013-01-09 12:47:36 handler_name : Core Media Data Handler Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 62 kb/s Metadata: creation_time : 2013-01-09 12:47:36 handler_name : Core Media Data Handler

En mi aplicación lo saco con expresiones regulares, es decir, en python:

import subprocess, re cmd = ''ffmpeg -i %s'' % pathtofile p = subprocess.Popen( cmd.split(" "), stderr = subprocess.PIPE, close_fds=True ) stdout, stderr = p.communicate() reo_rotation = re.compile(''rotate/s+:/s(?P<rotation>.*)'') match_rotation = reo_rotation.search(stderr) rotation = match_rotation.groups()[0]

No he intentado esto con una amplia gama de videos, solo un par de .movs grabados desde un iphone5, usando ffmpeg versión 1.0. Pero hasta ahora todo bien.


Dado que la mayoría de las cámaras almacenan su rotación / orientación dentro de los metifatos exif, sugeriría usar exifttool y una gema de ruby ​​wrapper llamada mini_exiftool que se mantiene activamente.

Instale exiftool:

apt-get exiftool || brew install exiftool || port install exiftool

O use el gestor de paquetes disponible.

Instala mini_exiftool:

gem install mini_exiftool

Intentalo:

irb> require ''mini_exiftool'' movie = MiniExiftool.new(''test_movie.mov'') movie.orientation #=> 90

aclamaciones