python wave,Python Wave字节数据

本文详细解释了如何使用Python的wave模块读取WAV文件,并将立体声音频转换为单声道。通过理解WAV文件格式标准,文章介绍了如何处理音频帧及其样本点,还提供了一个具体示例来展示如何实现从立体声到单声道的转换。

I'm trying to read the data from a .wav file.

import wave

wr = wave.open("~/01 Road.wav", 'r')

# sample width is 2 bytes

# number of channels is 2

wave_data = wr.readframes(1)

print(wave_data)

This gives:

b'\x00\x00\x00\x00'

Which is the "first frame" of the song. These 4 bytes obviously correspond to the (2 channels * 2 byte sample width) bytes per frame, but what does each byte correspond to?

In particular, I'm trying to convert it to a mono amplitude signal.

解决方案

If you want to understand what the 'frame' is you will have to read the standard of the wave file format. For instance: https://web.archive.org/web/20140221054954/http://home.roadrunner.com/~jgglatt/tech/wave.htm

From that document:

The sample points that are meant to be "played" ie, sent to a Digital to Analog Converter(DAC) simultaneously are collectively called a sample frame. In the example of our stereo waveform, every two sample points makes up another sample frame. This is illustrated below for that stereo example.

sample sample sample

frame 0 frame 1 frame N

_____ _____ _____ _____ _____ _____

| ch1 | ch2 | ch1 | ch2 | . . . | ch1 | ch2 |

|_____|_____|_____|_____| |_____|_____|

_____

| | = one sample point

|_____|

To convert to mono you could do something like this,

import wave

def stereo_to_mono(hex1, hex2):

"""average two hex string samples"""

return hex((ord(hex1) + ord(hex2))/2)

wr = wave.open('piano2.wav','r')

nchannels, sampwidth, framerate, nframes, comptype, compname = wr.getparams()

ww = wave.open('piano_mono.wav','wb')

ww.setparams((1,sampwidth,framerate,nframes,comptype,compname))

frames = wr.readframes(wr.getnframes()-1)

new_frames = ''

for (s1, s2) in zip(frames[0::2],frames[1::2]):

new_frames += stereo_to_mono(s1,s2)[2:].zfill(2).decode('hex')

ww.writeframes(new_frames)

There is no clear-cut way to go from stereo to mono. You could just drop one channel. Above, I am averaging the channels. It all depends on your application.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值