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从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
python调用matlab的m自定义函数方法
Feb 18 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
python scipy卷积运算的实现方法
Sep 16 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
python datetime处理时间小结
Apr 16 Python
Python调用shell命令常用方法(4种)
May 11 Python
python变量的作用域是什么
May 26 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
python怎么自定义捕获错误
Jun 29 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 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
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
js分页工具实例
2015/01/28 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
node网页分段渲染详解
2016/09/05 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python 列表list使用介绍
2014/11/30 Python
python异常和文件处理机制详解
2016/07/19 Python
python如何查看微信消息撤回
2018/11/27 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
计算机专业应届生求职信
2014/04/06 职场文书
转让协议书范本
2014/09/13 职场文书