Win10 python 声音输出切换_播放声音


开发精致的游戏,除了精美的交互设计、可玩性和平衡性,原来游戏的音乐音效也是非常重要的啊!
请点击右上角“关注”按钮关注我们,跟着木辛老师深入浅出的做出一款经典游戏吧!

通过前几次课程的学习,我们已经学到了关于图形、动画精灵、碰撞、动画和事件的知识,并且通过我们已经学习到的知识制作了第一个游戏:弹弹球

传送门:Python小课堂之贪玩的木辛老师:做一个弹弹球游戏吧

在今天的课程里,我们将会增加一个新的内容:声音。

为了让程序更加的有趣,更加的好玩,视频游戏和很多其他的程序都会加入很多声音。

声音既可以作为输入,也可以作为输出。作为输入,需要一个麦克风或者其他音源连接到计算机,程序会把声音记录下来,或者做其他的处理。

但是呢,声音作为输出更常见。

mixer

有些内容可能会比较复杂,比如图形,声音也是如此。

因为不同的计算机播放声音的硬件和软件不同;为了让问题更简单一些,我们打算请Pygame帮忙。

Pygame中有一个处理声音的模块:pygame.mixer。在真实世界中,取不同的声音并把它们混合在一起叫做“混音器(mixer)”,在Pygame中的模块也正是如此。

程序产生声音有两种基本方式

  1. 可以生成或者合成声音,就是指制造不同的音高和音量的声波来从头创建声音
  2. 可以播放一段录制好的声音,可以是CD上的音乐,也可以是MP3声音文件

播放声音

播放声音时,要从硬盘(或者互联网)得到一个声音文件,把它转换成可以在计算机的扬声器或者耳机上听到的声音。计算机上可以使用多种不同类型的声音文件,比如:

  1. 波形文件:以.wav结尾的文件
  2. MP3文件:以.mp3结尾的文件
  3. WMA(Windows媒体音频)文件:以.wma结尾的文件
  4. Ogg文件:以.ogg结尾的文件

在我们的例子里,主要是以.wav和.mp3文件为主,并将这些音频文件放置到程序目录的sounds子文件夹下。

Python会在这里查找文件,所以可以在程序中直接使用这个文件的名,比如:


sound_file = "./sounds/my_sound.wav"


当然了,如果声音文件没有复制到程序所在的同一个目录下,就需要将文件的完整路径告诉Python,比如


sound_file = "/PycharmProjects/PygameDemo/sounds/my_sound.wav"


启动 pygame.mixer

播放声音之前,我们需要先初始化 pygame.mixer。大家还记得初始化是什么意思嘛?指的是开始时让某个东西做好准备。

让pygame.mixer做好准备,只需要在初始化Pygame之后增加一行代码:


pygame.mixer.init()


所以,完整的程序开头可以这么写:


import pygame
pygame.init()
pygame.mixer.init()


现在我们已经做好了播放声音的准备。这些程序主要使用了两种类型的声音。第一种是音效或者声音片段。这些声音往往很短,通常保持在.wav文件中。

对于这种类型的声音,pygame.mixer会使用一个Sound对象,比如说像这样:


gong = pygame.mixer.Sound("gong.wav")
gong.play()


另一种使用的声音是音乐。音乐大多存储在.mp3、.wma或者.ogg文件中。要播放这些音乐,Pygame会使用mixer中的music模块。


pygame.mixer.music.load(“bg_music.mp3")
pggame.mixer.music.play()


这样歌曲会播放一次,然后停止。

咱们的例子可以这么写:


Win10 python 声音输出切换_秒针滴答60秒声音mp3_02


播放音效声音

运行一下这个程序试试效果吧(大家可以自己找找可用的wav文件,只有能出声即可,没有特殊要求)

现在我们试着改一下程序,使用mixer.music模块播放一些音乐:


Win10 python 声音输出切换_Win10 python 声音输出切换_03


播放音乐声音

小朋友们有没有注意到,我们暂时先将音效播放的代码注释掉了,使用的是我们之前讲到的注释的内容

传送门:Python小课堂 第十一课之 为了咱们之间的沟通 添加注释吧

好了,修改后的代码运行一下试试效果吧。

哦!声音好大呀!我们必须把计算机的音量调小一些才行,否则我们会被这么大的声音震聋的!

控制音量

可以使用音量控制开关来控制计算机上的声音音量。

在Windows系统上,这是利用系统托盘里的小扬声器图表完成的。这个设置会控制计算机上所有声音的音量。

不过除此之外,我们还可以控制Pygame发送到计算机声卡的音量。

让我们通过例子来看效果吧


Win10 python 声音输出切换_播放声音_04


修改控制音量

要设置音乐的音量,需要使用

pygame.mixer.music.set_volume(0.30)

而声音对象是pong,所以我们使用


gong.set_volume(0.50)


音量是一个介于0到1的浮点数;比如:0.50就是最大音量的50%,也就是一半。

咱们解决了声音音量的问题之后,还有一个问题需要咱们解决。

我们现在的例子是,只要程序开始运行,背景音乐和音效就一起开始工作了,可能我们需要控制一下,让他们按照我们希望的方式工作呢?

那好,就让我们尝试一下吧~

不过呢,在我们尝试之前,需要先了解下背景音乐工作机制:背景音乐是指玩游戏时在背景播放的音乐。

所以一旦开始播放背景歌曲,Pygame必须做好准备来做其他的事情,比如移动动画精灵,或者检查鼠标或者键盘事件。

但是,如果我们想知道歌曲什么时候结束该怎么办呢?

咱们可能希望等这首歌曲播放完毕之后会通知我们一下。

为此,Pygame提供了一种方法:你可以询问mixer.music模块是否还在忙于播放一首歌。如果忙,则说明歌曲还没播放完毕;如果不忙,说明歌曲已经结束了。

好了,咱们看看例子吧


Win10 python 声音输出切换_Python_05


判断音效播放完毕

嗯·······是不是很简单呀!咱们只需要在while循环里边,通过


pygame.mixer.music.get_busy()


检测当前模块是否繁忙,如果这个函数返回True,则说明当前模块很忙;如果不忙的话,就会返回False。那么就会执行这个代码块的下一个语句,播放音效并在等待1秒后退出程序。

不过有时候,我们的游戏时间可能比较长,咱们的背景音乐在播放完一遍后,就不会再有声音了,这样我们正好的游戏又回到了寂静的时代,这可怎么办呢?

Pygame为我们提供了一个机制,可以满足我们的这个需求,music模块可做到让音乐重复播放一定的次数,比如


pygame.mixer.music.play(3)


这样,歌曲就会连续播放3遍。如果传入一个特殊值:-1的话,这会让歌曲永远重复下去,直到咱们关闭程序为止。

小朋友们今天是不是又学到了很多知识呀!随着咱们课程的继续,小朋友们编程的水平也在逐日提高。

在不知不觉中,我们都深深的爱上了编程,也在学习中逐渐让我们的程序有了美妙的声音,大家觉得这是不是非常有意义呀!

好了,今天的课程就到这里吧,咱们下期再见!

小朋友们不要忘记关注我们哟 ,下期课程更精彩,请大家一起期待吧~

快乐编程,快乐成长,拜拜!