Python调用系统底层API播放wav文件的方法


Posted in Python onAugust 11, 2017

本文实例讲述了Python调用系统底层API播放wav文件的方法。分享给大家供大家参考,具体如下:

这里未使用其他库,只是使用 pywin32 调用系统底层 API 播放 wav 文件。

具体代码如下:

# Our raison d'etre - playing sounds
import pywintypes
import struct
import win32event
import win32com.directsound.directsound as ds
import os
WAV_HEADER_SIZE = struct.calcsize('<4sl4s4slhhllhh4sl')
def wav_header_unpack(data):
  '''解包wav文件头信息'''
  (riff, riffsize, wave, fmt, fmtsize, format, nchannels, samplespersecond, \
  datarate, blockalign, bitspersample, data, datalength) = struct.unpack('<4sl4s4slhhllhh4sl', data)
  if riff != b'RIFF' or fmtsize != 16 or fmt != b'fmt ' or data != b'data':
    raise ValueError
  wfx = pywintypes.WAVEFORMATEX()
  wfx.wFormatTag = format
  wfx.nChannels = nchannels
  wfx.nSamplesPerSec = samplespersecond
  wfx.nAvgBytesPerSec = datarate
  wfx.nBlockAlign = blockalign
  wfx.wBitsPerSample = bitspersample
  return wfx, datalength
# 播放wav文件,直到结束
sound_file = "音效-足球观众的欢呼声.wav"
fname = os.path.join(os.path.dirname(__file__), sound_file)
f = open(fname, 'rb')
# 读取/解包wav文件头
hdr = f.read(WAV_HEADER_SIZE)
wfx, size = wav_header_unpack(hdr)
d = ds.DirectSoundCreate(None, None)
d.SetCooperativeLevel(None, ds.DSSCL_PRIORITY)
sdesc = ds.DSBUFFERDESC()
sdesc.dwFlags = ds.DSBCAPS_STICKYFOCUS | ds.DSBCAPS_CTRLPOSITIONNOTIFY
sdesc.dwBufferBytes = size
sdesc.lpwfxFormat = wfx
buffer = d.CreateSoundBuffer(sdesc, None)
event = win32event.CreateEvent(None, 0, 0, None)
notify = buffer.QueryInterface(ds.IID_IDirectSoundNotify)
notify.SetNotificationPositions((ds.DSBPN_OFFSETSTOP, event))
buffer.Update(0, f.read(size))
buffer.Play(0)
win32event.WaitForSingleObject(event, -1)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
Python3匿名函数用法示例
Jul 25 Python
python实现括号匹配的思路详解
Aug 23 Python
Python tkinter和exe打包的方法
Feb 05 Python
python中安装django模块的方法
Mar 12 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
Python开发简易五子棋小游戏
May 02 Python
Django 导出 Excel 代码的实例详解
Aug 11 #Python
python技能之数据导出excel的实例代码
Aug 11 #Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 #Python
Python对字符串实现去重操作的方法示例
Aug 11 #Python
python中模块查找的原理与方法详解
Aug 11 #Python
python利用lxml读写xml格式的文件
Aug 10 #Python
Python编程实现及时获取新邮件的方法示例
Aug 10 #Python
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
php 方便水印和缩略图的图形类
2009/05/21 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
Javascript 面向对象特性
2009/12/28 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
js的回调函数详解
2015/01/05 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
Python抽象类的新写法
2015/06/18 Python
替换python字典中的key值方法
2018/07/06 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
GWT都有什么特性
2016/12/02 面试题
市场营销专科应届生求职信
2013/11/24 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
见习报告怎么写
2014/10/31 职场文书
新员工考核评语
2014/12/31 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
Nginx进程调度问题详解
2021/09/25 Servers