如何使用pyAudio获得左输出

时间:2019-01-24 15:35:15

标签: python audio pyaudio

假设我有一首歌,同时在耳机的两个扬声器上播放。我想使用pyAudio编写代码,以便仅在扬声器上输出。像videos演示左右检查的人一样。

我遇到了this问题,但我认为这不能解决我的问题。另外,由于我是新成员,因此无法对其进行评论,以作进一步说明。

我尝试通过上述链接的问题实施解决方案,但未给出正确答案。这是实现。

from struct import pack
from math import sin, pi
import wave
import random

RATE=44100

## GENERATE MONO FILE ##
wv = wave.open('music.wav', 'w')
wv.setparams((1, 2, RATE, 0, 'NONE', 'not compressed'))
maxVol=2**15-1.0 #maximum amplitude
wvData=bytes()

for i in range(0, RATE*3):
    # print(type(pack('h', int(maxVol*sin(i*500/RATE)))))
    wvData+=pack('h', int(maxVol*sin(i*500.0/RATE))) #500Hz

wv.writeframes(wvData)
wv.close()

我得到了一个3秒的剪辑,其中包含噪音作为输出,这是不期望的。实际输出只能在一个声道上播放音频,无论是左声道还是右声道。

1 个答案:

答案 0 :(得分:0)

wv.setparams((1, 2, RATE, 0, 'NONE', 'not compressed'))创建一个单声道文件。这意味着左声道和右声道是相同的(实际上, the 声道没有左声道和右声道)。

要仅在一侧发出声音,您需要具有两个通道的立体声文件。参见these examples。将0写入任一通道以使该侧“静音”。

我展示了一个如何在两侧之间实现淡入淡出的示例:

for i in range(0, RATE * 3):
    percent = (float(i) / (RATE * 3 - 1)) # for fade effect
    wvData += pack('h', int((1 - percent) * maxVol * sin(2 * pi * i * 500.0 / RATE)))
    wvData += pack('h', int(percent * maxVol * sin(2 * pi * i * 488.0 / RATE)))

还请注意,sin()函数的弧度为弧度,因此您必须将值乘以2pi。错过此步骤是听到噪音的原因。