【问题标题】:pygame playing sound very slowlypygame 播放声音很慢
【发布时间】:2013-05-01 00:37:27
【问题描述】:

我正在从事一个需要在程序中从头开始创建信号的项目。信号存储在一个数组中,每个元素都是一个样本。它应该以 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()

信号的返回图

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

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

【问题讨论】:

    标签: python python-2.7 pygame


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多