2010-01-14 39 views
10

tôi gán giá trị cho một biến x theo cách sau:Điều gì được trả về bởi wave.readframes?

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

Khi tôi gõ x tôi nhận được:

'\x1e\x00' 

Vì vậy x có một giá trị. Nhưng đó là gì? Là hệ thập lục phân? type(x)type(x[0]) cho tôi biết rằng xx[0] một chuỗi. Ai có thể cho tôi biết làm thế nào tôi nên giải thích các chuỗi này? Tôi có thể chuyển đổi chúng thành số nguyên không?

Trả lời

0

Chuỗi này thể hiện byte. Tôi đoán bạn có thể biến chúng thành một số nguyên với gói struct, cho phép diễn giải chuỗi byte.

7

Trình thông dịch tương tác lặp lại các ký tự không thể in được như vậy. Chuỗi chứa hai byte, 0x1E và 0x00. Bạn có thể chuyển đổi nó thành một số nguyên (WORD-size) với struct.unpack("<H", x) (ít endian!).

+0

Làm cách nào bạn chuyển đổi một mảng các số nguyên trở lại thành chuỗi có cùng định dạng sau này? – quano

+0

@quano: Mảng có phương thức ['.tostring()'] (http://docs.python.org/library/array.html#array.array.tostring). Đối với các chuỗi đơn giản, bạn có thể sử dụng 'struct.pack (" <4H ", 1, 2, 3, 4)'. numpy cũng nên có phương pháp tương tự. – AndiDog

1

Đó là một chuỗi hai byte:

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

Vâng, đó là trong hệ thập lục phân, nhưng ý nghĩa của nó phụ thuộc vào kết quả đầu ra khác của file wav ví dụ chiều rộng mẫu và số kênh. Dữ liệu của bạn có thể được đọc theo hai cách, 2 kênh và chiều rộng mẫu 1 byte (âm thanh stereo) hoặc 1 kênh và chiều rộng mẫu 2 byte (âm thanh đơn âm). Sử dụng x.getparams(): số đầu tiên sẽ là số lượng kênh và số thứ hai sẽ là chiều rộng mẫu.

This Link giải thích nó thực sự tốt.

Các vấn đề liên quan