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!
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
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.
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight
faire le travail sans grep
s
Une doublure ressemble à:
exiftool -b metavideo.mp4 -ImageSize
Cela retourne la chaîne WxH que vous recherchiez.
Je ne vois ici que des exemples d'utilisation de exiftool
et de l'analyse de sa sortie, ce qui semble être un choix étrange. exiftool
peut ê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.).
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 paquet:
$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480
Pourquoi exiftool
?
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:
' *: *'
- un deux-points :
entouré d'un nombre quelconque d'espaces.$1
) est Image Size
print $2
).Une autre version serait:
awk '/^Image Size/{print $4}'
Image
, Size
, :
et 1242x480
sont tous des champs différents.^
) à Image Size
, nous obtenons la ligne correcte.Image
, Size
et :
sont les trois premiers champs).Une utilisation légèrement ésotérique de mediainfo
extraira 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 ...
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;