OVH Cloud OVH Cloud

récupérer la durée d'un wma

6 réponses
Avatar
Titouille
Bonjour à tous !!

J'ai besoin de pouvoir récupérer la durée d'un ou plusieurs fichiers wma.

Après quelques recherches, je me suis tourné vers pymedia qui me
semblais adapté, mais en faisant des tests, je ne suis pas arrivé à
grand chose.

Voilà ce que j'ai testé : ça part d'un exemple fourni sur le forum (pour
la 1.3.5 pre1):

import pymedia.audio.acodec as acodec, pymedia.muxer as muxer
sName='Page01.wma'

dm= muxer.Demuxer( str.split( sName, '.' )[ -1 ].lower() )
f= open( sName, 'rb' )
s= f.read( 150000 )

frames= dm.parse( s )

print frames


Si je passe un fichier mp3, il me retourne des valeurs

Par contre, si je passe un fichier wma, il se plante lamentablement avec
le message d' "error reporting" de windows.


Il semblerai que ça soit un bug lié à wma, dans pymedia (d'après les
bugs cités pour la version 1.3.5)


Donc si quelqu'un a une solution à ce problème (ou une solution
alternative à pymedia pour simplement obtenir la durée d'un fichier
wma), je suis preneur pour n'importe quelle suggestion.

J'ai également laissé un message sur le forum pymedia.


D'avance merci !

A++

6 réponses

Avatar
Do Re Mi chel La Si Do
Bonjour !


J'ai une solution. Elle passe par l'utilisation de Ctypes, pour adresser les
fonctions MCI de windows.

Grâce à ça, je peux enregistrer, jouer, ou mesurer la longueur, d'un son, ou
d'une musique, pour les formats WAV, MP3, MID, WMA, AVI-audio.

Il faut juste que je retrouve où j'ai rangé ça. Et c'est ce point qui est
le plus délicat...

A toi de me dire si ça urge...


MCI
Avatar
Titouille
Hello !!

Ben ça serai bien utile, oui :) j'ai uniquement besoin de récupérer la
durée, c'est tout. Et c'est plus ou moins urgent... ça peut attendre
demain ou après demain, mais si possible avant la fin de semaine, ça
serai vraiment top :)


Merci michel !



Thierry

Bonjour !


J'ai une solution. Elle passe par l'utilisation de Ctypes, pour adresser les
fonctions MCI de windows.

Grâce à ça, je peux enregistrer, jouer, ou mesurer la longueur, d'un son, ou
d'une musique, pour les formats WAV, MP3, MID, WMA, AVI-audio.

Il faut juste que je retrouve où j'ai rangé ça. Et c'est ce point qui est
le plus délicat...

A toi de me dire si ça urge...


MCI





Avatar
Do Re Mi chel La Si Do
Salut !


Ci-dessous, le code (réduit).

Ne pas oublier de changer le nom du fichier, ligne [-5]

Et, il est plus simple de garder l'alias 'toto'.


Michel Claveau






# -*- coding: cp1252 -*-

import time
from ctypes import windll, c_buffer

class mci:
def __init__(self):
self.w32mci = windll.winmm.mciSendStringA
self.w32mcierror = windll.winmm.mciGetErrorStringA

def send(self,commande):
buffer = c_buffer(255)
errorcode = self.w32mci(str(commande),buffer,254,0)
if errorcode:
return errorcode, self.get_error(errorcode)
else:
return errorcode,buffer.value

def get_error(self,error):
error = int(error)
buffer = c_buffer(255)
self.w32mcierror(error,buffer,254)
return buffer.value

def directsend(self, txt):
(err,buf)=self.send(txt)
if err != 0:
print'Erreur',str(err),'sur',txt,':',buf
return (err,buf)

mci=mci()
mci.directsend('open "c:informaticien.wma" alias toto')
mci.directsend('set toto time format milliseconds')
err,buf=mci.directsend('status toto length ')
print 'Duree du fichier : ',buf,' millisecondes'
mci.directsend('close toto')
Avatar
Titouille
Re !!

J'ai repris ton exemple de code qui est plutot convaincant.
J'ai juste un problème avec :

dans mon cas, je dois tester 1 ou plusieurs fichiers wma pour récupérer
leur durée.

Dans ton message, tu dis qu'il est préférable de garder l'alias 'toto',
mais si je le garde, dès le second fichier wma testé, il me retourne une
erreur car le fichier dont l'alias est toto "est déjà utilisé dans cette
application"...

Donc ce que je me demandais, c'est si utiliser plusieurs alias allait
représenter une utlisation mémoire plus grande (car plusieurs références
pointant sur plusieurs fichiers), et si c'est le cas, comment faire pour
"écraser" la référence actuelle par une autre sans provoquer d'erreur...
par exemple évaluer une commande "close" ou "delete" via directsend ???

Voilà... Si tu as une suggestion, ça me serai bien utile :)

D'avance merci, a+

Salut !


Ci-dessous, le code (réduit).

Ne pas oublier de changer le nom du fichier, ligne [-5]

Et, il est plus simple de garder l'alias 'toto'.


Michel Claveau






# -*- coding: cp1252 -*-

import time
from ctypes import windll, c_buffer

class mci:
def __init__(self):
self.w32mci = windll.winmm.mciSendStringA
self.w32mcierror = windll.winmm.mciGetErrorStringA

def send(self,commande):
buffer = c_buffer(255)
errorcode = self.w32mci(str(commande),buffer,254,0)
if errorcode:
return errorcode, self.get_error(errorcode)
else:
return errorcode,buffer.value

def get_error(self,error):
error = int(error)
buffer = c_buffer(255)
self.w32mcierror(error,buffer,254)
return buffer.value

def directsend(self, txt):
(err,buf)=self.send(txt)
if err != 0:
print'Erreur',str(err),'sur',txt,':',buf
return (err,buf)

mci=mci()
mci.directsend('open "c:informaticien.wma" alias toto')
mci.directsend('set toto time format milliseconds')
err,buf=mci.directsend('status toto length ')
print 'Duree du fichier : ',buf,' millisecondes'
mci.directsend('close toto')




Avatar
Titouille
Lol :)

Bon, ben je suis tombé la dessus :
http://www.frbox.net/viewtopic-193904.html ou tu donnais un exemple
presque identique, mais avec quelques lignes en + (la fermeture du
fichier, par exemple...)

J'avais tenté d'envoyer un message avec directsend en faisant

self.directsend( 'close "' + filename + '"' )

mais ça ne fonctionnait pas... en fait, il suffisait de passer
l'alias... hem :s


Bref, merci pour ton aide précieuse, Michel


Re !!

J'ai repris ton exemple de code qui est plutot convaincant.
J'ai juste un problème avec :

dans mon cas, je dois tester 1 ou plusieurs fichiers wma pour récupérer
leur durée.

Dans ton message, tu dis qu'il est préférable de garder l'alias 'toto',
mais si je le garde, dès le second fichier wma testé, il me retourne une
erreur car le fichier dont l'alias est toto "est déjà utilisé dans cette
application"...

Donc ce que je me demandais, c'est si utiliser plusieurs alias allait
représenter une utlisation mémoire plus grande (car plusieurs références
pointant sur plusieurs fichiers), et si c'est le cas, comment faire pour
"écraser" la référence actuelle par une autre sans provoquer d'erreur...
par exemple évaluer une commande "close" ou "delete" via directsend ???

Voilà... Si tu as une suggestion, ça me serai bien utile :)

D'avance merci, a+



Avatar
Do Re Mi chel La Si Do
Bonjour !


Je pense que tu as raison, en utilisant la commande "delete" de MCI.
Mais, normalement, le "close" pourrait suffire.

En fait, ces commandes existaient, dans mon code-source original, avec les
commandes "play", "record", etc.

Mais, je les avais enlevé, à ta demande (je cite : "uniquement besoin de
récupérer la durée, c'est tout.")

Finalement, quelques soient les méthodes et les langages, les spécifs des
utilisateurs sont à la rue... ;-)))
C'est toujours la même chanson. Et, pour cette chanson-là, je ne sais pas
comment on détermine sa longueur...



En pratique, j'utilise très peu ce genre de chose. Je m'en sers seulement
pour attacher des commentaires vocaux à des objets Python persistants.




@-salutations
--
Michel Claveau