pygame学习笔记(4):声音控制


Posted in Python onApril 15, 2015

pygame.mixer是一个用来处理声音的模块,其含义为“混音器”。游戏中对声音的处理一般包括制造声音和播放声音两部分,这里仅学习了播放声音部分。

1、pygame.mixer启动与初始化

pygame.mixer.init():mixer的初始化。程序中,使用时,一般放在最前面的几句代码中:

import pygame

pygame.init()

pygame.mixer.init()

2、播放声音片段wav文件
播放声音片段wav文件时,pygame.mixer使用Sound对象,格式为:
soundwav=pygame.mixer.Sound("filename.wav") #filename.wav文件名

soundwav.play()

在游戏中,往往用下面的代码来完成:
import pygame,sys

pygame.init()

pygame.mixer.init()

screen=pygame.display.set_mode([640,480])

pygame.time.delay(1000)#等待1秒让mixer完成初始化

soundwav=pygame.mixer.Sound("filename.wav") 

soundwav.play()

while 1:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            sys.exit()

3、播放mp3、wma、ogg音乐文件
这里只是学习了一个mp3文件,如果非windows系统,那可以试试ogg文件。播放音乐文件主要使用pygame.mixer中的music模块,主要方法为:
pygame.mixer.music.load("filename.mp3")

pygame.mixer.music.play(n,start,stop)#第一个参数为播放次数,如果是-1表示循环播放,省略表示只播放1次。第二个参数和第三个参数分别表示播放的起始和结束位置。

完整的代码为:
import pygame,sys

pygame.init()

pygame.mixer.init()

screen=pygame.display.set_mode([640,480])

pygame.time.delay(1000)

pygame.mixer.music.load("filename.mp3")

pygame.mixer.music.play()

while 1:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            sys.exit()

程序在运行时,一旦开始播放音乐,就会继续做下一件事情,也就是说,如果我们要播放两首歌,那么
pygame.mixer.music.load("filename1.mp3")

pygame.mixer.music.play()

pygame.mixer.music.load("filename2.mp3")

pygame.mixer.music.play()

这段代码运行后,就会出现两首歌同时在播放的情况。实际中,我们常常需要播放完一首,再播放另一首,这样就需要利用pygame.mixer.music.get_busy()函数来判断,如果函数返回值为True那么说明目前处于忙的状态,否则返回 False。例如:
import pygame,sys

pygame.init()

pygame.mixer.init()

screen=pygame.display.set_mode([640,480])

pygame.time.delay(1000)

pygame.mixer.music.load("filename.mp3")

pygame.mixer.music.play()

soundwav=pygame.mixer.Sound("filename.wav") 

while 1:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            sys.exit()

    if not pygame.mixer.music.get_busy():

        soundwav.play()

        pygame.time.delay(5000)#等待5秒让filename.wav播放结束

        sys.exit()

4、控制音量

pygame.mixer.music.set_volume()用来控制音量,取值范围为0-1.0的浮点数。0为最小值,1为最大值。

5、制作mp3播放器中遇到的问题

python+wxpython+pygame完全可以很容易方便的做出一个mp3播放器,但是在制作中遇到两个问题:

一是中文歌曲名的显示,通过搜索已经解决,加上# encoding='GBK'
二是pygame在播放mp3文件时,发现并不是所有的mp3文件都有播放,常常会出现播放声音不正确的情况,有时只是杂响。经过与python学习交流群(2)中的すeasyげ交流,すeasyげ提出位速128kbps的mp3文件可以播放,但从网上下了几个128kbps的mp3测试后,发现播放不正常的情况依然存在。不知道哪位大牛能解决这一问题,希望能把解决方法告知一下,谢谢。

因此,如果您打算写一个mp3的播放工具,python能做mp3播放的模块很多,这里,我觉得可以考虑使用mp3play模块,比较方便简单。目前版本为mp3play 0.1.15,具体下载地址为http://pypi.python.org/pypi/mp3play/。这里简单介绍一下其主要方法:

play(n,starms,endms):播放,第一个参数表示次数,第二、三个参数表示播放的起止位置,单位是毫秒。
stop(): 停止。
pause(), unpause(): 暂停和开始。
isplaying(): 判断是否正在播放,如果返回为TRUE,表示正在播放歌曲。
ispaused(): 判断是否为暂停,如果返回为TRUE,表示暂停。
seconds(): 返回mp3文件共多少秒,注意这里的单位是秒。
milliseconds(): 返回mp3文件共多少毫秒,注意这里的单位是毫秒。
mp3play首页上给出的例子为:

import mp3play

filename = r'C:\music.mp3'#播放c盘下的music.mp3文件

clip = mp3play.load(filename)

clip.play()

import time

time.sleep(min(30, clip.seconds()))#如果mp3文件的长度小于30少时,全部播放完,否则仅播放30秒。

clip.stop()

Python 相关文章推荐
python获取android设备的GPS信息脚本分享
Mar 06 Python
Python中encode()方法的使用简介
May 18 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
简单了解python元组tuple相关原理
Dec 02 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
Python的Django框架使用入门指引
Apr 15 #Python
python中xrange用法分析
Apr 15 #Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 #Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 #Python
python实现telnet客户端的方法
Apr 15 #Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 #Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 #Python
You might like
PHP的开合式多级菜单程序
2006/10/09 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
jquery 事件对象属性小结
2010/04/27 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
python模块之StringIO使用示例
2015/04/08 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
python程序如何进行保存
2020/07/03 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
介绍一下Python下range()函数的用法
2013/11/07 面试题
暑期社会实践学生的自我评价
2014/01/09 职场文书
监察建议书范文
2014/03/12 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python