以下代码将频率为400Hz的简单正弦写入单声道WAV文件。如何更改此代码以生成一个 立体声 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):
作为header子句,和一个带有两个的body writeframes
电话 - 一个用于 s
,一个 t
。 IOW,两个通道的相应帧在文件中“交替”。
参见例如 这个 页面,详细描述了所有可能的WAV文件格式,我引述:
多声道数字音频样本
存储为隔行波数据
这只是意味着音频
多通道的样本(例如
立体声和环绕声)波形文件
通过音频循环存储
以前每个频道的样本
推进到下一个样本时间。
这样就完成了音频文件
可以播放或流式播放
整个文件都可以读取。这很方便
从磁盘播放大文件时
(可能不完全适合
内存)或通过文件传输文件
互联网。图中的值
下面将存储在Wave文件中
按照它们列出的顺序排列
值列(从上到下)。
并且下表清楚地显示了通道的样本左,右,左,右......
例如,制作立体声 .wav
文件,请参阅 test_wave.py
模。
该测试产生一个全零文件。
您可以通过插入交替的样本值进行修改。
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()