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判断操作系统类型代码分享
Nov 22 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
python使用udp实现聊天器功能
Dec 10 Python
python中的print()输出
Apr 12 Python
详解用python写一个抽奖程序
May 10 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
Django模板获取field的verbose_name实例
May 19 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
Python实现byte转integer
Jun 03 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
JavaScript 创建对象
2009/07/17 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
vue axios post发送复杂对象问题
2019/06/04 Javascript
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python引用模块和查找模块路径
2016/03/17 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python如何实现爬取B站视频
2020/05/20 Python
python Cartopy的基础使用详解
2020/11/01 Python
Python Http请求json解析库用法解析
2020/11/28 Python
python 通过exifread读取照片信息
2020/12/24 Python
《池塘边的叫声》教学反思
2014/04/12 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
神秘岛读书笔记
2015/07/01 职场文书
高一地理教学工作总结
2015/08/12 职场文书
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android