J'essaie d'obtenir la résolution de la vidéo avec la commande suivante:
ffmpeg -i filename.mp4
J'ai une longue sortie, mais il me faut juste la largeur et la hauteur de mon script bash. Comment dois-je filtrer ces paramètres? Peut-être qu'il y a une meilleure façon de faire ça.
ffprobe
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
1280x720
Voir la documentation sur les options -of
pour plus de choix et d'options. Voir également Astuces FFprobe pour d'autres exemples, notamment la durée et la cadence.
Sans wrapper [STREAM]
:
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 input.mp4
width=1280
height=720
Sans clé:
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4
1280
720
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
1280,720
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
"programs": [
],
"streams": [
{
"width": 1280,
"height": 720
}
]
}
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of xml input.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
<programs>
</programs>
<streams>
<stream width="1280" height="720"/>
</streams>
</ffprobe>
Les commandes suivantes reposent uniquement sur ffmpeg
(et grep
et cut
) pour vous donner la hauteur ou la largeur requise:
La taille:
$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1
1280
Largeur:
$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2
720
La différence entre les deux est simplement le paramètre -f
à cut
.
Si vous préférez la chaîne de résolution complète, vous n'avez pas besoin de cut
:
$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'
1280x720
Voici ce que nous faisons avec ces commandes:
ffmpeg -i
pour obtenir les informations sur le fichier.Video:
.digitsxdigits
qui contient entre 3 et 5 caractères.x
.La sortie de ffprobe
ressemble à ceci:
streams_stream_0_width=1280
streams_stream_0_height=720
Techniquement, vous pouvez utiliser eval
pour les affecter à des variables bash
, mais cela n'est pas nécessaire et peut être dangereux. voir ici pour plus:
Puisque vous utilisez bash
, profitez plutôt de ses tableaux intégrés et de sa manipulation de chaîne:
filepath="filename.mp4"
width_prefix='streams_stream_0_width='
height_prefix='streams_stream_0_height='
declare -a dimensions
while read -r line
do
dimensions+=( "${line}" )
done < <( ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "${filepath}" )
width_with_prefix=${dimensions[0]}
height_with_prefix=${dimensions[1]}
width=${width_with_prefix#${width_prefix}}
height=${height_with_prefix#${height_prefix}}
printf "%s\t%sx%s\n" "${filepath}" "${width}" "${height}"
Utilisez grep pour sélectionner uniquement les lignes que vous recherchez. Redirige la sortie de STDERR vers STDOUT, puisque ffmpeg affichera toutes les informations à cet endroit.
ffmpeg -i filename.mp4 2>&1 | grep <keyword>
Edit: Un exemple complet de travail utilisant Perl:
$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | Perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480
J'ai finalement trouvé la réponse:
J'ai utilisé ce paquet appelé Info média
Et puis j'ai commandé:
mediainfo mediainfo --Inform="Video;%Width%" midhand.mp4
Pour afficher la liste des paramètres:
mediainfo --Info-Parameters
Meilleur outil pour extraire les métadonnées vidéo!
Je sais que la question concerne bash, mais, juste au cas où quelqu'un finira ici pour chercher une solution pour un lot Windows, comme moi avant de le découvrir.
for /f "delims=" %%a in ('ffprobe -hide_banner -show_streams filename.mp4 2^>nul ^| findstr "^width= ^height="') do set "myvideo_%%a"
Aucun message de console et vous vous retrouvez avec les variables d'environnement Nice myvideo_width
et myvideo_height
. Vous pouvez le vérifier avec:
C:\>set myvideo_
myvideo_height=720
myvideo_width=1280
Si la résolution de votre vidéo est de 1280x720, bien sûr.