本文实例讲述了Python调用系统底层API播放wav文件的方法。分享给大家供大家参考,具体如下:
这里未使用其他库,只是使用 pywin32 调用系统底层 API 播放 wav 文件。
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# 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程序设计有所帮助。
原文链接:http://www.cnblogs.com/hhh5460/p/5856950.html