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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
简单了解Python中的几种函数
Nov 03 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
python实现狄克斯特拉算法
Jan 17 Python
Python File(文件) 方法整理
Feb 18 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python 类之间的参数传递方式
Dec 20 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 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中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue+iview分页组件的封装
2020/11/17 Vue.js
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
学python最电脑配置有要求么
2020/07/05 Python
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
物流合作计划书
2014/01/10 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
家长通知书教师评语
2014/04/17 职场文书
画展邀请函
2015/01/31 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
天河观后感
2015/06/11 职场文书
红色经典电影观后感
2015/06/18 职场文书
整脏治乱工作简报
2015/07/21 职场文书