2010-01-14 3 views
10

-je attribuer une valeur à une variable x de la manière suivante:Qu'est-ce qui est retourné par wave.readframes?

import wave 
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r') 
x = w.readframes(1) 

Quand je tape x je reçois:

'\x1e\x00' 

donc x a obtenu une valeur. Mais qu'est-ce que c'est? Est-ce hexadécimal? type(x) et type(x[0]) dites-moi que x et x[0] a chaînes. Quelqu'un peut-il me dire comment dois-je interpréter ces chaînes? Puis-je les transformer en entier?

Répondre

0

Ces chaînes représentent des octets. Je suppose que vous pouvez les transformer en entier avec struct package, ce qui permet d'interpréter des chaînes d'octets.

7

L'interpréteur interactif fait écho aux caractères non imprimables comme cela. La chaîne contient deux octets, 0x1E et 0x00. Vous pouvez le convertir en entier (WORD-size) avec struct.unpack("<H", x) (little endian!).

+0

Comment convertir un tableau de nombres entiers en chaîne dans le même format après cela? – quano

+0

@quano: Les tableaux sont dotés de la méthode ['.tostring()'] (http://docs.python.org/library/array.html#array.array.tostring). Pour des séquences simples, vous pouvez utiliser 'struct.pack (" <4H ", 1, 2, 3, 4)'. numpy devrait également avoir des méthodes similaires. – AndiDog

1

Il est une chaîne de deux octets:

>>> x='\x1e\x00' 
>>> map(ord, list(x)) 
[30, 0] 
>>> [ord(i) for i in x] 
[30, 0] 
0

Oui, il est en hexadécimal, mais ce que cela signifie dépend des autres sorties du fichier wav par exemple la largeur de l'échantillon et le nombre de canaux. Vos données peuvent être lues de deux manières: 2 canaux et 1 octet de largeur d'échantillon (son stéréo) ou 1 canal et 2 octets de largeur d'échantillon (son mono). Utilisez x.getparams(): le premier nombre sera le nombre de canaux et le second sera la largeur de l'échantillon.

This Link explique très bien.

Questions connexes