如何在Python中编写立体声wav文件?
以下代码将400Hz频率的简单正弦信号写入单声道WAV文件。如何更改此代码才能生成立体声 WAV文件。第二个频道应该是不同的频率。如何在Python中编写立体声wav文件?
import math
import wave
import struct
freq = 440.0
data_size = 40000
fname = "WaveTest.wav"
frate = 11025.0 # framerate as a float
amp = 64000.0 # multiplier for amplitude
sine_list_x = []
for x in range(data_size):
sine_list_x.append(math.sin(2*math.pi*freq*(x/frate)))
wav_file = wave.open(fname, "w")
nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, framerate, nframes,
comptype, compname))
for s in sine_list_x:
# write the audio frames to file
wav_file.writeframes(struct.pack('h', int(s*amp/2)))
wav_file.close()
建立一个平行sine_list_y
列表与所述其它频率/信道,设置nchannels=2
,并在输出回路使用for s, t in zip(sine_list_x, sine_list_y):
作为标题条款,以及具有两个writeframes
呼叫的身体 - 一个用于s
,一个用于t
。 IOW,两个通道的相应帧在文件中“交替”。
参见例如this页的所有可能的WAV文件格式的详尽描述,我引用:
多通道数字音频采样 存储为隔行波数据 它只是意味着音频多信道的 样品(例如 立体声和环绕声)波形文件 通过循环存储每个通道的音频 样本,然后 前进到下一个采样时间。 这样做是为了在可以读取整个文件之前播放或传输音频文件 。当从磁盘 (可能不完全适合 内存)播放大文件或通过 Internet流式传输文件时,这是方便的 。下面的图 中的值将按照它们在 值列(从上到下)中列出的顺序存储在Wave文件 中。
和下表清楚地表明去左边通道的样品,右,左,右,...
我个人认为他们会↑↑↓↓←→←→B A,但可能是只有我。 – 2013-06-19 13:17:14
为了产生立体声.wav
文件的示例,请参见test_wave.py
module。 测试产生一个全零文件。 您可以通过插入交替采样值进行修改。
nchannels = 2
sampwidth = 2
framerate = 8000
nframes = 100
# ...
def test_it(self):
self.f = wave.open(TESTFN, 'wb')
self.f.setnchannels(nchannels)
self.f.setsampwidth(sampwidth)
self.f.setframerate(framerate)
self.f.setnframes(nframes)
output = '\0' * nframes * nchannels * sampwidth
self.f.writeframes(output)
self.f.close()
设置'nchannels = 2'的一个开始;) – ChrisF 2010-09-03 15:43:26