如何使用pyAudio获取左声道输出

3
假设我有一首歌,在我的耳机上的两个扬声器上播放。我想使用pyAudio编写代码,以便只在一个扬声器上获得输出。就像这些视频演示了左右检查一样。
我阅读了问题,但我认为这并不能解决我的问题。另外,由于我是新成员,我不能对其进行评论以获得进一步的澄清。
我尝试实现上面链接问题的解决方案,但它没有给我正确的答案。以下是实施方式。
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秒剪辑作为输出,这是不期望的。实际输出应该只播放单声道音频,可以是左声道或右声道。

其实我不确定pyAudio能否做到这一点。但是我的这个评论并没有依据,只是因为我使用过这个库并且仔细阅读了文档。你可以通过pulsectl或类似的方式来控制操作系统中的实际输出接口。 - Torxed
感谢@Torxed提供的信息。然而,根据这个问题,每个帧都有两个通道。我猜这些通道基本上是左右输出(我不知道这是否正确)。也许如果我们能做一些事情,去除其中一个通道,那么我想这可能是可能的。 - Kaptain Kirk
那个问题是关于源媒体的,对的,它有两个通道。但是回放也可以有两个通道,我不认为pyAudio允许你控制单独输出通道。你可以可能操作原始源媒体-当然。但这与获取pyAudio(输出/混音)的左/右通道不同。 - Torxed
这个问题对你仍然有意义吗,@KaptainKirk? - handras
1个回答

0

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

要使声音只在一侧听到,您需要一个具有两个声道的立体声文件。请参见这些示例。将其中一个声道写入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。没有执行此步骤是听到噪音的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接