我正在使用python音频进行调试,对音频编码很难。
这里我有一个充满音频数据的字符串,比如说[10,20,100]。
但是数据存储在字符串变量
中data = "����������������"
我想检查这个字符串的值。
以下是我尝试过的事情
我尝试使用print "%i" % data[0]
Traceback (most recent call last):
File "wire.py", line 28, in <module>
print "%i" % data[i]
TypeError: %d format: a number is required, not str
int(data[0])
最后以
Traceback (most recent call last):
File "wire.py", line 27, in <module>
print int(data[0])
ValueError: invalid literal for int() with base 10: '\xd1'
对此有何想法?我想以数字方式打印字符串,因为字符串实际上是一个声波阵列。
您的所有答案都非常有用。
该字符串实际上是从麦克风生成的,因此我认为它是原始波形或振动数据。此外,这应该参考音频API文档PortAudio。
在查看PortAudio之后,我找到了这个有用的例子。
** This routine will be called by the PortAudio engine when audio is needed.
** It may called at interrupt level on some machines so don't do anything
** that could mess up the system like calling malloc() or free().
static int patestCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
paTestData *data = (paTestData*)userData;
float *out = (float*)outputBuffer;
unsigned long i;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) inputBuffer;
for( i=0; i<framesPerBuffer; i++ )
{
*out++ = data->sine[data->left_phase]; /* left */
*out++ = data->sine[data->right_phase]; /* right */
data->left_phase += 1;
if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE;
data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
}
return paContinue;
}
这表明我可以通过某种方式将数据解释为float
答案 0 :(得分:3)
要清楚,您的音频数据是一个字节字符串。字节字符串表示存储在音频文件中的字节。您不会简单地将这些字节转换为有意义的值,而不必先了解二进制文件中的内容。
作为一个例子,mp3规范说每个mp3包含标题帧(在此描述:http://en.wikipedia.org/wiki/MP3)。要读取标题,您需要使用bitstring之类的内容,或者如果您觉得自己习惯于按位操作,那么您只需要解包一个整数(4个字节)并进行一些数学运算来计算出值32个人的比特。
这完全取决于您尝试阅读的内容以及数据的生成方式。如果你有完整的字节数,那么struct将很好地为你服务。
答案 1 :(得分:1)
如果您对上面提到的\xd1
感到满意:
for item in data: print repr(item),
请注意,for x in data
将迭代列表中的每个值而不是其位置。如果您需要该位置,可以使用for i in range(len(data)): ...
如果您想要数字形式,请将repr(item)
替换为ord(item)
。
答案 2 :(得分:0)
最好使用新的{}.format
方法:
data = "����������������"
print '{0}'.format(data[3])
答案 3 :(得分:0)
您可以使用ord
将每个字节映射到0-255之间的数值:
print map(ord, data)
或者,对于Python 3兼容性,请执行:
print([ord(c) for c in data])
它也可以使用Unicode字形,这可能不是您想要的,因此请确保在Python 2中有一个bytearray或一个实际的str
或bytes
对象。