2010-01-14 13 views
10

que asignar un valor a una variable x de la siguiente manera:¿Qué devuelve wave.readframes?

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

Cuando escribo me sale: x

'\x1e\x00' 

Así x tiene un valor. Pero, ¿qué es eso? ¿Es hexadecimal? type(x) y type(x[0]) dime que x y x[0] a strings. ¿Alguien puede decirme cómo debo interpretar esta cadena? ¿Puedo transformarlos en un número entero?

Respuesta

0

Estas cadenas representan los bytes. Supongo que puede convertirlos en un entero con el paquete struct, que permite interpretar cadenas de bytes.

7

El intérprete interactivo hace eco de caracteres no imprimibles como ese. La cadena contiene dos bytes, 0x1E y 0x00. Puede convertirlo en un entero (WORD-size) con struct.unpack("<H", x) (little endian!).

+0

¿Cómo convertirías una matriz de enteros a una cadena en el mismo formato después de esto? – quano

+0

@quano: las matrices tienen el método ['.tostring()'] (http://docs.python.org/library/array.html#array.array.tostring). Para secuencias simples, puede usar 'struct.pack (" <4H ", 1, 2, 3, 4)'. numpy también debería tener métodos similares. – AndiDog

1

Es una cadena de dos bytes:

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

Sí, es en hexadecimal, pero lo que significa depende de las otras salidas del archivo de sonido, por ejemplo, el ancho de la muestra y el número de canales. Sus datos se pueden leer de dos maneras: 2 canales y ancho de muestra de 1 byte (sonido estéreo) o ancho de muestra de 1 canal y 2 bytes (sonido mono). Use x.getparams(): el primer número será el número de canales y el segundo será el ancho de muestra.

This Link lo explica muy bien.