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的subprocess模块总结
Nov 07 Python
python清除字符串里非字母字符的方法
Jul 02 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
对Python 语音识别框架详解
Dec 24 Python
python时间日期操作方法实例小结
Feb 06 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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长字符串定义方法
2012/07/12 PHP
PHP基础知识回顾
2012/08/16 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
Python分治法定义与应用实例详解
2017/07/28 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
C++的几个面试题附答案
2016/08/03 面试题
保荐人的岗位职责
2013/11/19 职场文书
工作失职检讨书500字
2014/10/17 职场文书
文言文辞职信
2015/02/28 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
2016中秋节广告语
2016/01/28 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers