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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
详解python之配置日志的几种方式
May 22 Python
Python Web编程之WSGI协议简介
Jul 18 Python
Django web框架使用url path name详解
Apr 29 Python
python3.7简单的爬虫实例详解
Jul 08 Python
基于django传递数据到后端的例子
Aug 16 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
浅谈Python type的使用
Nov 19 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
Pycharm plot独立窗口显示的操作
Dec 11 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
javascript中的隐式调用
2018/02/10 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
angular多语言配置详解
2019/05/16 Javascript
react的hooks的用法详解
2020/10/12 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
浅谈Python基础—判断和循环
2019/03/22 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
如何在Python对Excel进行读取
2020/06/04 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
英语演讲稿范文
2014/01/03 职场文书
初一体育教学反思
2014/01/29 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
社区安全温馨提示语
2015/07/14 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
高中信息技术教学反思
2016/02/16 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
python在package下继续嵌套一个package
2022/04/14 Python