10 votes

Une doublure ffmpeg (ou autre) pour obtenir la seule résolution ?

Je ne suis pas très versé dans la ligne de commande, alors j'espère que cette question n'est pas trop stupide.

Si je me présente :

ffmpeg -i videofile.avi

J'obtiens un résultat comme celui-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 je ne m'intéressais qu'à la commande produisant "640x480", comment pourrais-je le faire ?

J'imagine que je dois diriger la sortie vers une expression régulière et l'exécuter ? Je ne sais pas du tout comment faire. Merci de votre compréhension.

12voto

Robert Gilliam Points 21

Utilisation ffprobe du paquetage ffmpeg :

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

Exemple de résultat :

1280x720

Ce que font ces options :

  • -v error rend la sortie moins verbeuse.
  • -select_streams v:0 sélectionne uniquement le premier flux vidéo.
  • -show_entries stream=width,height choisit uniquement width y height de la grande liste des paramètres que ffprobe peut fournir.
  • -of csv=s=x:p=0 formate la sortie texte. Les csv est utilisé parce qu'il produit un résultat simple. s=x lui fait utiliser un x pour séparer les width y height valeurs. p=0 lui permet d'omettre l'élément stream dans le résultat.

Voir le Documentation ffprobe y FFmpeg Wiki : astuces ffprobe pour plus d'informations.

10voto

Cyrus Points 4962

Obtenir la résolution de la vidéo avec ffmpeg :

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

Sortie (par exemple) :

640x480

5voto

Alex Dolgov Points 51
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

faire le travail sans aucune grep s

Le one-liner se présente comme suit :

exiftool -b metavideo.mp4 -ImageSize

Cela renvoie la chaîne WxH que vous recherchiez.

3voto

Juicy Scripter Points 131

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

exiftool -ImageSize -s3 filename

Les résultats se présenteront sous la forme d'un formulaire WIDTHxHEIGHT (eq : 1280×720 )

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

2voto

muru Points 180007

Vous pouvez le faire en utilisant des expressions régulières et ffmpeg mais je préférerais utiliser exiftool , qui fait partie de la libimage-exiftool-perl Install libimage-exiftool-perl l'emballage :

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

Pourquoi exiftool ?

  • En ffmpeg / avprobe Les services publics 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). Il peut être difficile de déterminer quelle est la résolution.
  • exiftool En revanche, il produit 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 des espaces), vous pouvez facilement extraire la valeur.

Quel est le awk est le suivant :

  • Fixer le séparateur de champs à ' *: *' - un colon : entouré d'un nombre quelconque d'espaces.
  • Vérifier si le premier champ ( $1 ) est Image Size
  • Et imprimer le deuxième champ ( print $2 ).

Une autre version serait la suivante :

awk '/^Image Size/{print $4}'
  • Par défaut, awk utilise les espaces pour séparer les champs, donc Image , Size , : y 1242x480 sont tous des domaines 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 y : sont les trois premiers champs).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X