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