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更新列表的方法
Jul 28 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
Python实现的桶排序算法示例
Nov 29 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python中的decorator的作用详解
Jul 26 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
Python Flask框架模板操作实例分析
May 03 Python
python使用rsa非对称加密过程解析
Dec 28 Python
Python脚本去除文件的只读性操作
Mar 05 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
php在线生成ico文件的代码
2007/10/09 PHP
php实现字符串翻转的方法
2015/03/27 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
Python的一些用法分享
2012/10/07 Python
python进阶教程之文本文件的读取和写入
2014/08/29 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python机器学习库常用汇总
2017/11/15 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
波兰珠宝品牌:YES
2019/08/09 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
镇创先争优活动总结
2014/08/28 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
五年级学生评语大全
2014/12/26 职场文书
晚会开幕词
2015/01/28 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS