Solución:
Usar ffprobe
Ejemplo 1: con claves / nombres de variables
ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 input.mp4
width=1280
height=720
Ejemplo 2: solo ancho x alto
ffprobe -v error -show_entries stream=width,height -of csv=p=0:s=x input.m4v
1280x720
Ejemplo 3: JSON
ffprobe -v error -select_streams v -show_entries stream=width,height -of json input.mkv
{
"programs": [
],
"streams": [
{
"width": 1280,
"height": 720
}
]
}
Ejemplo 4: JSON Compact
ffprobe -v error -select_streams v -show_entries stream=width,height -of json=compact=1 input.mkv
{
"programs": [
],
"streams": [
{ "width": 1280, "height": 720 }
]
}
Ejemplo 5: XML
ffprobe -v error -select_streams v -show_entries stream=width,height -of xml input.mkv
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
<programs>
</programs>
<streams>
<stream width="1280" height="720"/>
</streams>
</ffprobe>
Qué hacen las opciones:
-
-v error
Realice una salida silenciosa, pero permita que se muestren los errores. Excluye la información de salida FFmpeg genérica habitual, incluida la versión, la configuración y los detalles de entrada. -
-show_entries stream=width,height
Solo muestra elwidth
yheight
información de flujo. -
-of
La opción elige el formato de salida (predeterminado, compacto, csv, plano, ini, json, xml). Consulte FFprobe Documentation: Writers para obtener una descripción de cada formato y ver opciones de formato adicionales. -
-select_streams v:0
Esto se puede agregar en caso de que su entrada contenga múltiples transmisiones de video.v:0
seleccionará solo el primer flujo de video. De lo contrario, obtendrás tantoswidth
yheight
salidas ya que hay secuencias de video.-select_streams v
se puede usar para mostrar información de todas las transmisiones de video y evitar el audio vacíostream
info en salida JSON y XML. -
Consulte la documentación de FFprobe y FFmpeg Wiki: FFprobe Tips para obtener más información.
Eche un vistazo a mediainfo. Maneja la mayoría de los formatos que existen.
Si está buscando una forma de analizar la salida de ffmpeg, use la expresión regular d+xd+
Ejemplo usando perl:
$ ./ffmpeg -i test020.3gp 2>&1 | perl -lane 'print $1 if /(d+xd+)/'
176x120
Ejemplo usando python (no perfecto):
$ ./ffmpeg -i /nfshome/enilfre/pub/test020.3gp 2>&1 | python -c "import sys,re;[sys.stdout.write(str(re.findall(r'(d+xd+)', line))) for line in sys.stdin]"
[][][][][][][][][][][][][][][][][][][][‘176×120’][][][]
Las frases de Python no son tan pegadizas como las de Perl 🙂
De la sugerencia de Fredrik anterior, así es como lo hice usando MediaInfo (http://mediainfo.sourceforge.net/en):
>>> p1 = subprocess.Popen(['mediainfo', '--Inform=Video;%Width%x%Height%',
'/Users/david/Desktop/10stest720p.mov'],stdout=PIPE)
>>> dimensions=p1.communicate()[0].strip('n')
>>> dimensions
'1280x688'