What is returned by wave.readframes?
Asked Answered
A

4

14

I assign a value to a variable x in the following way:

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

When I type x I get:

'\x1e\x00'

So x got a value. But what is that? Is it hexadecimal? type(x) and type(x[0]) tell me that x and x[0] a strings. Can anybody tell me how should I interpret this strings? Can I transform them into integer?

Abridge answered 14/1, 2010 at 10:54 Comment(0)
F
7

The interactive interpreter echoes unprintable characters like that. The string contains two bytes, 0x1E and 0x00. You can convert it to an integer with struct.unpack("<h", x) (little endian, 2 bytes, signed).

Finedrawn answered 14/1, 2010 at 10:58 Comment(3)
How would you convert an array of integers back to string in the same format after this?Foraminifer
@quano: Arrays have the .tostring() method. For simple sequences, you can use struct.pack("<4H", 1, 2, 3, 4). numpy should also have similar methods.Finedrawn
Should be "<h" because the audio data in wavs is signed when stored with 2 bytes.Harman
M
3

Yes, it is in hexadecimal, but what it means depends on the other outputs of the wav file e.g. the sample width and number of channels. Your data could be read in two ways, 2 channels and 1 byte sample width (stereo sound) or 1 channel and 2 byte sample width (mono sound). Use x.getparams(): the first number will be the number of channels and the second will be the sample width.

This Link explains it really well.

Match answered 17/11, 2013 at 2:12 Comment(0)
A
1

It's a two byte string:

>>> x='\x1e\x00'
>>> map(ord, list(x))
[30, 0]
>>> [ord(i) for i in x]
[30, 0]
Acceleration answered 14/1, 2010 at 11:0 Comment(0)
D
0

This strings represent bytes. I guess you can turn them into an integer with struct package, which allows interpreting strings of bytes.

Dynamometry answered 14/1, 2010 at 10:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.