¿Un liner ffmpeg (u otro) para obtener solo resolución?


9

No estoy muy versado en la línea de comando, así que espero que no sea una pregunta demasiado estúpida.

Si corro:

ffmpeg -i videofile.avi

Me sale una salida como esta:

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

Si solo estuviera interesado en el comando que genera "640x480", ¿cómo podría hacerlo?

Me imagino que tengo que canalizar la salida y realizar una expresión regular. No tengo idea de cómo hacer eso. ¡Gracias!

Respuestas:


10

Obtenga resolución de video con ffmpeg:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

Salida (por ejemplo):

640x480

La respuesta de muru fue ciertamente más que suficiente, pero esta responde específicamente a mi pregunta tal como se la hizo (es decir, usando ffmpeg). No sé cuál es el protocolo aquí con elegir una respuesta. En este caso, creo que la respuesta de Muru es más útil, mientras que la de Cyrus es más acertada. Lo siento, no estoy seguro de qué camino tomar, pero en este momento estoy seleccionando Cyrus ', ya que es muy específicamente lo que pedí (pero estoy usando Muru's lol)
bcsteeve

1
Pero ten cuidado. El ejemplo que se muestra en la pregunta daría como resultado que grep produzca dos coincidencias (la primera 0x44...y la segunda son la resolución).
muru

Si la entrada contiene múltiples transmisiones de video, como una entrada de un DVD, esta respuesta generará una width x heighttransmisión por video en varias líneas. Esto se puede evitar si se desea con ffprobe, o agregando head -n 1al comando en la respuesta.
llogan


4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

hacer el trabajo sin ningún greps

One-liner se ve así:

exiftool -b metavideo.mp4 -ImageSize

Eso devuelve la cadena WxH que estaba buscando.


Esto no es técnicamente una línea.
David Foerster

No me he dado cuenta de que se solicita de una sola línea, de todos modos, hacer el mismo ancho: el parámetro ImageSize devuelve una cadena WxH.
Alex Dolgov

¡Mira el título de la pregunta otra vez! ;-) De todos modos +1
David Foerster

3

Solo veo aquí ejemplos de uso exiftooly análisis de su salida, lo que parece ser una elección extraña. exiftoolse puede usar de manera directa para obtener la resolución (y casi cualquier otro metadato):

exiftool -ImageSize -s3 filename

Will resultados de la producción en una forma WIDTHxHEIGHT(eq: 1280×720)

NOTA: -s3indica a exiftool que produzca el formato de salida más corto (sin nombres de etiquetas, comillas, etc.)


2

Puede hacer esto usando expresiones regulares y ffmpeg, pero prefiero usar exiftool, parte del paquete libimage-exiftool-perlInstalar libimage-exiftool-perl :

$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480

¿Por qué exiftool?

  • Las ffmpeg/ avprobeutilities imprimen líneas del formulario Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480donde es posible uno o más valores del formulario AAAxBBB(como puede ver en su ejemplo). Determinar cuál es la resolución puede ser difícil.
  • exiftool, por otro lado, genera datos del formulario Type : Value. Por lo tanto, es más fácil obtener el campo exacto, a saber Image Size. Además, dada la forma en que se especifican los campos (separados por dos puntos y espacios en blanco), puede extraer fácilmente el valor.

Lo que hace el awkcomando es:

  • Establezca el separador de campo en ' *: *'- dos puntos :rodeados por cualquier número de espacios.
  • Compruebe si el primer campo ( $1) esImage Size
  • E imprima el segundo campo ( print $2).

Una versión alternativa sería:

awk '/^Image Size/{print $4}'
  • Por defecto, que AWK usa para dividir el espacio en blanco los campos, por lo que Image, Size, :y 1242x480son todas diferentes campos.
  • Al hacer coincidir el comienzo de la línea ( ^) con Image Size, obtenemos la línea correcta.
  • E imprimimos el cuarto campo (desde entonces Image, Sizey :son los primeros tres campos).

¡Gracias! Podría sugerirle que edite su ejemplo para cambiar "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" a algo más genérico. Al principio lo estaba usando literalmente porque no lo reconocí como un nombre de archivo. Por supuesto, vi mi error 2 segundos después y su solución funciona muy bien.
bcsteeve

@bcsteeve Lo utilicé porque es parte del contenido de ejemplo instalado en el escritorio de Ubuntu (ver /usr/share/example). : D
muru

1

Un uso ligeramente esotérico de mediainfoextraerá fácilmente el ancho y la altura en el formato que está utilizando una línea simple. Observe el siguiente ejemplo en mi sistema:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

Se pueden ver los diversos parámetros adicionales que se pueden utilizar de esta manera, mediainfo --Info-Parameterspero tal vez este simple uso por sí solo sea suficiente para usted ...


0

Hice un forbucle de 1 línea para extraer la resolución del directorio de archivos.

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;

3
El análisis lsno terminará bien ... las citas no solucionarán el problema
Zanna

no me ha fallado aún después de 100,000 codificaciones
Kevin Dollabillz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.