web-dev-qa-db-fra.com

Comment utiliser ffmpeg pour obtenir la résolution vidéo?

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.

11
Vladimir Stazhilov

Utilisez ffprobe

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

Exemples d'autres choix de formatage de sortie

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.

Default

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

CSV

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

JSON

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}

XML

$ 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>
26
llogan

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:

  1. Lancer ffmpeg -i pour obtenir les informations sur le fichier.
  2. Extraire la ligne qui contient seulement les informations Video:.
  3. Extraire juste une chaîne ressemblant à digitsxdigits qui contient entre 3 et 5 caractères.
  4. Pour les deux premiers, coupez le texte avant ou après le x.
2
aalaap

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:

https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided-in-bash-and-what-should-i-use-instead

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}"
2

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
1
Andreas F

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!

1
Vladimir Stazhilov

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.

0
cdlvcdlv