当前位置:  开发笔记 > 编程语言 > 正文

一次播放很多声音

如何解决《一次播放很多声音》经验,为你挑选了1个好方法。

我试图在python中创建一个程序,在按下某个键时播放特定的大键琴音符.我希望它保持响应,这样你就可以继续播放更多的音符(有点像普通的电钢琴.)但是,因为存储音符的wav文件长约7-10秒,我遇到了一些问题.我每秒至少可以按10键.因此,在一个音符的持续时间内,我可以同时播放大约100个不同的wav文件.我试图使用winsound,但它无法一次播放多个wav文件.然后我转移到PyAudio,它有点像.我发现完成我想要的唯一方法是:

from msvcrt import getch
import pyaudio
import wave
import multiprocessing as mp

#This function is just code for playing a sound in PyAudio
def playNote(filename):

    CHUNK = 1024

    wf = wave.open(filename, 'rb')


    p = pyaudio.PyAudio()

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    data = wf.readframes(CHUNK)

    while data != '':
        stream.write(data)
        data = wf.readframes(CHUNK)

    stream.stop_stream()
    stream.close()

    p.terminate()


if __name__ == "__main__":

    while True:
        #If the 'a' key is pressed: start a new process that calls playNote
        #and pass in the file name for a note. 
        if ord(getch()) == 97: #a

            mp.Process(target=playNote, args=("F:\Project Harpsichord\The wavs\A1.wav",)).start()

        #If the 's' key is pressed: start a new process that calls playNote
        #and pass in the file name for another note. 
        if ord(getch()) == 115: #s

            mp.Process(target=playNote, args=("F:\Project Harpsichord\The wavs\A0.wav",)).start()

基本上每当我想玩新的wav时,我都必须启动一个运行playNote函数中代码的新进程.正如我已经说过的那样,我可以同时进行多达100次这样的比赛.可以这么说,所有一次运行的python解释器的一百份副本几乎撞坏了我的计算机.我也尝试过类似的多线程方法,但遇到了同样的问题.

这篇文章展示了一种方法将多个wav文件混合在一起,以便它们可以同时播放,但由于我的程序不一定同时启动声音,我不确定这是否有效.我需要一种有效的方法来同时播放多个音符.无论是以另一个图书馆的形式出现,还是以其他语言形式出现,我都不在乎.



1> Joshua Jurge..:

我按照JF Sebastian的建议检查了pygame。最终正是我所需要的。我将pygame.mixer.Sound()与pygame.mixer.set_num_channels()结合使用。这是我想出的。

import pygame as pg
import time

pg.mixer.init()
pg.init()

a1Note = pg.mixer.Sound("F:\Project Harpsichord\The wavs\A1.wav")
a2Note = pg.mixer.Sound("F:\Project Harpsichord\The wavs\A0.wav")

pg.mixer.set_num_channels(50)

for i in range(25):
    a1Note.play()
    time.sleep(0.3)
    a2Note.play()
    time.sleep(0.3)

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有