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抓取Discuz!用户名脚本代码
Dec 30 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
发布你的Python模块详解
Sep 15 Python
Python的标准模块包json详解
Mar 13 Python
Python使用剪切板的方法
Jun 06 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
pyqt5简介及安装方法介绍
Jan 31 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
django 基于中间件实现限制ip频繁访问过程详解
Jul 30 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 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生成html分页列表的代码
2007/03/18 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JS控制表格隔行变色
2006/06/26 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
JS中表单的使用小结
2014/01/11 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python json读写方式和字典相互转化
2020/04/18 Python
python 写一个水果忍者游戏
2021/01/13 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
40岁生日感言
2014/02/15 职场文书
好学生评语大全
2014/05/05 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
详解Python中__new__方法的作用
2022/03/31 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers