【问题标题】:How to write stereo wav files in Python?如何在 Python 中编写立体声 wav 文件?
【发布时间】:2011-04-07 22:21:33
【问题描述】:

以下代码将频率为 400Hz 的简单正弦波写入单声道 WAV 文件。应如何更改此代码以生成 stereo 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()

【问题讨论】:

  • 设置nchannels = 2 ;)

标签: python wav wave


【解决方案1】:

有关生成立体声 .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()

【讨论】:

    【解决方案2】:

    另一种选择是使用 SciPy 和 NumPy 库。在下面的示例中,我们生成了一个立体声文件,其中左声道具有低频音调,而右声道具有高频音调。

    要安装 SciPy,请参阅: https://pypi.org/project/scipy/

    import numpy as np
    from scipy.io import wavfile
    
    # User input
    duration=5.0
    toneFrequency_left=500 #Hz (20,000 Hz max value)
    toneFrequency_right=1200 #Hz (20,000 Hz max value)
    
    # Constants
    samplingFrequency=48000
    
    # Generate Tones
    time_x=np.arange(0, duration, 1.0/float(samplingFrequency))
    toneLeft_y=np.cos(2.0 * np.pi * toneFrequency_left * time_x)
    toneRight_y=np.cos(2.0 * np.pi * toneFrequency_right * time_x)
    
    # A 2D array where the left and right tones are contained in their respective rows
    tone_y_stereo=np.vstack((toneLeft_y, toneRight_y))
    
    # Reshape 2D array so that the left and right tones are contained in their respective columns
    tone_y_stereo=tone_y_stereo.transpose()
    
    # Produce an audio file that contains stereo sound
    wavfile.write('stereoAudio.wav', samplingFrequency, tone_y_stereo)
    

    环境说明

    使用的版本 Python 3.7.1

    • Python 3.7.1
    • SciPy 1.1.0

    【讨论】:

      【解决方案3】:

      用另一个频率/频道构建一个并行的sine_list_y 列表,设置nchannels=2,并在输出循环中使用for s, t in zip(sine_list_x, sine_list_y): 作为标题子句,以及一个带有两个writeframes 调用的主体——一个用于@ 987654327@,一个为t。 IOW,文件中两个通道“交替”的对应帧。

      参见例如this 页面详细描述了所有可能的 WAV 文件格式,我引用:

      多声道数字音频样本 存储为隔行波数据 这仅仅意味着音频 多通道样本(例如 立体声和环绕声)波形文件是 通过音频循环存储 之前每个通道的样本 推进到下一个采样时间。 这样做是为了使音频文件 可以在之前播放或流式传输 可以读取整个文件。这很方便 从磁盘播放大文件时 (这可能不完全适合 内存)或通过 互联网。图中的值 下面将存储在 Wave 文件中 按照它们在列表中列出的顺序 值列(从上到下)。

      下表清楚地显示了通道的样本向左、向右、向左、向右……

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多