web-dev-qa-db-fra.com

Un revêtement ffmpeg (ou autre) pour obtenir uniquement la résolution?

Je ne suis pas très au courant de la ligne de commande, donc j'espère que ce n'est pas une question stupide.

Si je cours:

ffmpeg -i videofile.avi

Je reçois une sortie comme celle-ci:

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 seulement la commande émettant "640x480" m'intéressait, comment pourrais-je le faire?

J'imagine que je dois diriger la sortie vers, et effectuer une expression régulière? Aucune idée de comment faire ça. Merci!

8
bcsteeve

Obtenir la résolution vidéo avec ffmpeg:

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

Sortie (par exemple):

 640x480 
8
Cyrus

En utilisant ffprobe à partir du package ffmpeg:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720

Voir les documentation de ffprobe et FFmpeg Wiki: astuces de ffprobe pour plus d’informations.

9
llogan
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

faire le travail sans greps

Une doublure ressemble à:

exiftool -b metavideo.mp4 -ImageSize

Cela retourne la chaîne WxH que vous recherchiez.

4
Alex Dolgov

Je ne vois ici que des exemples d'utilisation de exiftoolet de l'analyse de sa sortie, ce qui semble être un choix étrange. exiftoolpeut être utilisé directement pour obtenir la résolution (et presque toutes les métadonnées):

exiftool -ImageSize -s3 filename

Le résultat sera sous la forme WIDTHxHEIGHT(eq: 1280×720)

REMARQUE: -s3 indique à exiftool de produire le format de sortie le plus court (sans les noms de balises, guillemets, etc.).

3
Juicy Scripter

Vous pouvez le faire en utilisant des expressions régulières et ffmpeg, mais je préférerais utiliser exiftool , qui fait partie du libimage-exiftool-Perl Install libimage-exiftool-Perl paquet:

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

Pourquoi exiftool?

  • Les utilitaires ffmpeg/avprobe impriment des lignes de la forme Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480 où une ou plusieurs valeurs de la forme AAAxBBB sont possibles (comme vous pouvez le voir dans votre exemple). Déterminer laquelle est la résolution peut être difficile.
  • exiftool, en revanche, génère des données de la forme Type : Value. Il est donc plus facile d’obtenir le champ exact, à savoir Image Size. De plus, étant donné la manière dont les champs sont spécifiés (séparés par deux points et un espace), vous pouvez facilement extraire la valeur.

La commande awk est la suivante:

  • Définissez le séparateur de champ sur ' *: *' - un deux-points : entouré d'un nombre quelconque d'espaces.
  • Vérifiez si le premier champ ($1) est Image Size
  • Et imprimez le deuxième champ (print $2).

Une autre version serait:

awk '/^Image Size/{print $4}'
  • Par défaut, awk utilise des espaces pour scinder les champs. Ainsi, Image, Size, : et 1242x480 sont tous des champs différents.
  • En faisant correspondre le début de la ligne (^) à Image Size, nous obtenons la ligne correcte.
  • Et nous imprimons le quatrième champ (puisque Image, Size et : sont les trois premiers champs).
2
muru

Une utilisation légèrement ésotérique de mediainfoextraira facilement la largeur et la hauteur dans le format que vous utilisez après avoir utilisé une simple ligne. Observez l'exemple suivant sur mon système:

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

Les divers autres paramètres qui peuvent être utilisés de cette manière peuvent être vus avec mediainfo --Info-Parameters mais peut-être que cette utilisation simple suffira à elle seule ...

1
andrew.46

J'ai créé une boucle forà 1 ligne pour extraire la résolution du répertoire des fichiers.

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;
0
Kevin Dollabillz