pygame播放声音很慢

时间:2013-05-01 00:37:27

标签: python python-2.7 pygame

我正在开发一个项目,需要从头开始在程序中创建信号。信号存储在一个数组中,每个元素都是一个样本。它应该以44.1 kHz播放。由于项目的其他方面,我使用pygame来实现这一目标。 Pygame有一个功能,允许从一个numpy数组创建一个Sound对象,并像一个wav文件一样播放。初始化pygame.mixer时,我将频率设置为44100 Hz,但Sound对象播放的频率约为10 kHz。

这是pygame中的错误,还是需要做一些其他事情来完成以给定速率播放数组?

def test_script(t):
    bin_sig[0:8] = throttle(t)
    bin_sig[8:28] = restofsignal()
    bin_sig[28:32] = checksum(bin_sig)

    print bin_sig
    sig = create_audiosig(bin_sig)*60

    pygame.mixer.init(44100,-16,1,2**16)
    num_ary = numpy.array(sig)
    plt.plot(num_ary)
    plt.savefig('generated_signal.jpg')

    if (sys.argv[1] == 'on'):
        s = pygame.sndarray.make_sound(num_ary)
        s.play()

    plt.show()

信号enter image description here

的返回图

有60个长度为6835的脉冲。以44.1 kHz播放,这需要9.3秒。但是,它需要37.2秒(11020赫兹)。

如果您需要查看更多代码,可以找到它here

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。但是,因为当我发现与我有同样问题的论坛帖子时,我看到的是“我解决了它,感谢你的帮助”,我内心有点死,我将发布答案。

创建numpy数组时,显然它使用64位数据类型的元素。创建声音对象时,它将使用init()期间指定的位数(在本例中为16)。当它从数组中读取数据类型时,它为每个元素读取4个值(64位元素中的4个16位值)。要解决此问题,请在调用numpy.array()时指定dtype = numpy.dtype('int16')

numpy.array(sig, dtype=numpy.dtype('int16'))