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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
python实现读取命令行参数的方法
May 22 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python 依赖库太多了该如何管理
Nov 08 Python
Python接口测试get请求过程详解
Feb 28 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 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
解析crontab php自动运行的方法
2013/06/24 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
PyQt5每天必学之布局管理
2018/04/19 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
党员干部公开承诺书
2014/03/26 职场文书
三方合作协议书范本
2014/04/18 职场文书
厂区绿化方案
2014/05/08 职场文书
夏季药店促销方案
2014/08/22 职场文书
认识实习感想
2015/08/10 职场文书
vue 实现上传组件
2021/05/31 Vue.js
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
详解Golang如何优雅的终止一个服务
2022/03/21 Golang
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫