MediaInfo: Lire les informations des fichiers vidéo et audio en ligne de commande. (Part 2)
Par Narann le dimanche, 29 novembre 2009, 18:59 - Script et code - Lien permanent
Lors du billet précédent nous avons vu comment extraire une information (le nombre d'image) d'un fichier Quicktime en ligne de commande. Je vous propose ici la suite de ce tutorial en utilisant Python afin d'étendre cette possibilité à tout les fichiers d'un dossier.
MediaInfo reconnaissant un bon paquet de format, à la fin de ce tuto, vous aurez la possibilité d'étendre ce script suivant votre usage.
Ce qu'on veux faire
L'idée est de récupérer une liste de ce type:
SEQ006PL055.mov -> 134 images
SEQ006PL056.mov -> 97 images
SEQ006PL057.mov -> 63 images
etc...
Ladite liste étant les fichiers Quicktime d'un dossier...
Et maintenant, le python
import os import re def frameCount(path): for fileName in os.listdir(path): filePath = path+"/"+fileName #"C:/myQuicktimeFiles" + "/" + "SEQ006PL055.mov" if(os.access(filePath, os.F_OK)): #verifie que le chemin filePath est bien un fichier et qu'on peut y acceder handle = os.popen("C:/MediaInfo/MediaInfo.exe --Inform=Video;%FrameCount% "+filePath).read() #recupere la sortie du programme print(fileName+" -> "+re.sub("\n", "", handle)+" images") #affiche le resultat frameCount("C:/myQuicktimeFiles")
Dans un premier temps, il faut lister les fichiers contenus dans le dossier spécifié. Pour ça, nous utilisons la methode os.listdir():
>>> os.listdir("C:/myQuicktimeFiles") ['SEQ006PL055.mov', 'SEQ006PL056.mov', 'SEQ006PL057.mov']
Pour exécuter une commande système en python on peut utiliser plusieurs méthodes. La première que j'ai utilisé fut:
os.system("ma commande")
Mais le problème est que cette commande renvois la valeur de retour du programme (souvent "0" ce qui signifie que tout c'est bien passé) mais elle ne renvois pas ce qu'écrit le programme et c'est précisément ça qui nous intéresse.
Après quelques recherche j'ai trouvé exactement la commande qui m'intéressait:
os.popen("ma commande")
Cette commande renvois donc tout ce qu'a sortie la commande exécutée dans un "tunnel de communication"... J'ai un peu galéré pour savoir comment "réinterpréter" tout ça mais voici la commande que j'ai trouvé ici:
os.popen("ma commande").read()
Avec ça, nous avons une chaine de caractère toute propre comme si elle sortait de notre console! :sourit:
Au niveau du print j'ai du faire une bidouille pour éviter qu'il ne saute deux ligne à chaque ligne:
re.sub("\n", "", handle)
Cette ligne "substitue" les caractère de retour à la ligne "\n" par "rien" dans la chaine de caractère "handle"
Et c'est tout! (Enfin je crois... ^^ )
Ce deuxième tuto n'était qu'une formalité comparé au précédent mais il était dans la continuité.
N'hésitez pas à poster un commentaire si vous rencontrez des difficultés lié à l'utilisation de ce tutorial.
A bientôt!
Commentaires
Pour info, il y a dans le package DLL.zip http://downloads.sourceforge.net/me... pour la version actuelle, un exemple pour comment utiliser la DLL avec Python (2 ou 3) : c'est plus rapide, c'est du Python sans passer par la ligne de commande, tout ça...
Et il suffira de deux lignes :
MediaInfo::Open(xxx)
MediaInfo::Get(Stream_Video, 0, "FrameCount")
Je sais qu'il faut que je réorganise l'aide pour la ligne de commande, les fichiers exemple, car ce n'est pas assez visible...
Jérôme, développeur de MediaInfo.
Bonjours Jérôme,
Content d'intéresser le dev de MediaInfo ;)
En effet, je viens de voir le wrapper Python de la DLL. Je pense que ducoup je ferai un autre petit billet pour expliquer la méthode à utiliser.
Concernant la doc de la CLI, je n'ai pas cherché plus que ça mais c'est vrai que j'ai pas trouvé de suite comment faire.
La méthode Python me semble en effet plus adapté au traitement par lot.
Merci pour l'information en tout cas ;)
Dorian