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中使用lambda高效操作列表的教程
Apr 24 Python
python使用urllib2实现发送带cookie的请求
Apr 28 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
Python3遍历目录树实现方法
May 22 Python
Python 对象中的数据类型
May 13 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
基于python实现百度翻译功能
May 09 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 Python
python 实现定时任务的四种方式
Apr 01 Python
python 破解加密zip文件的密码
Apr 22 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+ajax实现无刷新分页
2015/11/18 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
Vue2.0如何发布项目实战
2017/07/27 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
Python json模块dumps、loads操作示例
2018/09/06 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python如何变换环境
2020/07/21 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
NULL是什么,它是怎么定义的
2015/05/09 面试题
初中美术教学反思
2014/01/29 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
小学少先队活动总结
2015/05/08 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
找规律教学反思
2016/02/23 职场文书
在js中修改html body的样式
2021/11/11 Javascript
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android