如何在Pygame中为声道分配声音?

时间:2016-06-25 13:21:21

标签: python python-2.7 audio pygame

我正试图在Pygame中同时播放多个声音。我有背景音乐,我想要连续播放雨声并播放偶然的雷声。

我尝试过以下但是当雷声响起时我的雨声停止了。我尝试过使用频道,但我不知道如何选择播放哪个频道,或者是否可以同时播放两个频道。

$(document).ready(function() {
   $('#username').on('keyup', function() {
        $.ajax({
            type: 'POST',
            url: 'adm/chk_uname_avail.php',
            data: {uname : changeuser.username.value},
            success: function(result) {
                var $btn = $('#submiButton');
                if (result.taken) {
                    $btn.prop('disabled', true);
                } else {
                    $btn.prop('disabled', false);
                }
                //As @Mikey notice, You can just use this as simply as
                //$('#submiButton').prop('disabled', result.taken);
            }        
        });
   });
});

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

Pygame的find_channel功能使在未使用的频道上播放音频变得非常容易:

sound1 = pygame.mixer.Sound("sound.wav")
pygame.mixer.find_channel().play(sound1)

请注意,默认情况下,如果没有可用的频道,find_channel将返回None。通过传递True,您可以返回播放音频时间最长的声道:

sound1 = pygame.mixer.Sound("sound.wav")
pygame.mixer.find_channel(True).play(sound1)

您可能还对set_num_channels功能感兴趣,该功能可让您设置最大音频通道数:

pygame.mixer.set_num_channels(20)

答案 1 :(得分:1)

每个频道一次只能播放一个声音,但您可以一次播放多个频道。如果你没有命名频道,pygame会选择一个未使用的频道播放声音;默认情况下,pygame有8个通道。您可以通过创建Channel对象来指定通道。至于无限循环声音,您可以通过使用参数loops = -1播放声音来实现。您可以在http://www.pygame.org/docs/ref/mixer.html发现这些类和方法的文档 我还建议使用内置模块时间,特别是sleep()函数,它在几秒钟内暂停执行指定的时间。这是因为pygame.mixer功能在声音播放完毕之前很快播放声音返回,当您尝试在同一声道播放第二声音时,第一声音停止播放第二声音。因此,为了保证您的雷声播放完成,最好在播放时暂停执行。我将sleep()行放在if语句之外,因为在if语句中,如果雷声没有被播放,sleep()行不会暂停执行,所以循环会很快循环到了下一个雷声,输出频率远高于偶尔输出。"

import pygame
import random
import time
import var

# initialize pygame.mixer
pygame.mixer.init(frequency = 44100, size = -16, channels = 1, buffer = 2**12) 
# init() channels refers to mono vs stereo, not playback Channel object

# create separate Channel objects for simultaneous playback
channel1 = pygame.mixer.Channel(0) # argument must be int
channel2 = pygame.mixer.Channel(1)

# plays loop of rain sound indefinitely until stopping playback on Channel,
# interruption by another Sound on same Channel, or quitting pygame
channel1.play(var.rain_sound, loops = -1)

# plays occasional thunder sounds
duration = var.thunder_sound.get_length() # duration of thunder in seconds
while True: # infinite while-loop
    # play thunder sound if random condition met
    if random.randint(0,80) == 10:
        channel2.play(var.thunder_sound)
    # pause while-loop for duration of thunder
    time.sleep(duration)