Un liner ffmpeg (ou autre) pour n'obtenir qu'une résolution?


9

Je ne connais pas très bien la ligne de commande, donc j'espère que ce n'est pas trop stupide.

Si je cours:

ffmpeg -i videofile.avi

J'obtiens 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 je n'étais intéressé que par la commande produisant "640x480", comment pourrais-je faire cela?

J'imagine que je dois diriger la sortie vers et effectuer une expression régulière? Je ne sais pas comment faire ça. Merci!

Réponses:


10

Obtenez 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

La réponse de Muru était certainement plus que suffisante, mais celle-ci répond spécifiquement à ma question telle que posée (c'est-à-dire en utilisant ffmpeg). Je ne sais pas quel est le protocole ici avec le choix d'une réponse. Dans ce cas, je pense que la réponse de Muru est plus utile tandis que celle de Cyrus est plus pertinente. Désolé, je ne sais pas où aller, mais en ce moment je sélectionne Cyrus 'car c'est très précisément ce que j'ai demandé (mais j'utilise le lol de Muru)
bcsteeve

1
Attention cependant. L'exemple montré dans la question entraînerait la grep produisant deux correspondances (la première 0x44...et la seconde étant la résolution).
muru

Si l'entrée contient plusieurs flux vidéo, tels qu'une entrée provenant d'un DVD, cette réponse produira un width x heightflux vidéo par ligne sur plusieurs lignes. Cela peut être évité si vous le souhaitez avec ffprobe, ou en ajoutant head -n 1à la commande dans la réponse.
llogan


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

faire le travail sans aucun greps

Une doublure ressemble à:

exiftool -b metavideo.mp4 -ImageSize

Cela renvoie la chaîne WxH que vous cherchiez.


Ce n'est pas techniquement un one-liner.
David Foerster

Je n'ai pas remarqué que c'est un liner demandé, de toute façon faire le même paramètre largeur -ImageSize renvoie la chaîne WxH.
Alex Dolgov

Regardez à nouveau le titre de la question! ;-) Quoi qu'il en soit +1
David Foerster

3

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

exiftool -ImageSize -s3 filename

Est-ce que les résultats de la production sous une forme WIDTHxHEIGHT(eq: 1280×720)

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


2

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

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

Pourquoi exiftool?

  • Les utilitaires ffmpeg/ avprobeimpriment des lignes du formulaire Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480où une ou plusieurs valeurs du formulaire AAAxBBBsont possibles (comme vous pouvez le voir dans votre exemple). Il peut être difficile de déterminer laquelle est la résolution.
  • exiftool, d'autre part, génère des données du formulaire Type : Value. Il est donc plus facile d'obtenir le champ exact, à savoir Image Size. De plus, étant donné la façon dont les champs sont spécifiés (séparés par deux points et des espaces), vous pouvez facilement extraire la valeur.

Ce que fait la awkcommande est:

  • 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) estImage Size
  • Et imprimez le deuxième champ ( print $2).

Une autre version serait:

awk '/^Image Size/{print $4}'
  • Par défaut, awk utilisations des espaces de diviser les champs, donc Image, Size, :et 1242x480sont tous différents domaines.
  • En faisant correspondre le début de la ligne ( ^) à Image Size, nous obtenons la ligne correcte.
  • Et nous imprimons le quatrième champ (depuis Image, Sizeet :sont les trois premiers champs).

Merci! Je pourrais vous suggérer de modifier votre exemple pour changer "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" en quelque chose de plus générique. Au début, je l'utilisais littéralement parce que je ne le reconnaissais pas comme un nom de fichier. Bien sûr, j'ai vu mon erreur 2 secondes plus tard et votre solution fonctionne très bien!
bcsteeve

@bcsteeve Je l'ai utilisé car il fait partie de l'exemple de contenu installé sur le bureau Ubuntu (voir /usr/share/example). : D
muru

1

Une utilisation légèrement ésotériquemediainfo permet d'extraire facilement la largeur et la hauteur dans le format que vous utilisez après avoir utilisé une simple doublure. 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 sont visibles, mediainfo --Info-Parametersmais peut-être que cette simple utilisation suffira à elle seule ...


0

J'ai fait une forboucle 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;

3
L'analyse lsne se terminera pas bien ... la citation ne résoudra pas le désordre
Zanna

ne m'a pas encore échoué après 100 000 encodages
Kevin Dollabillz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.