zoukankan      html  css  js  c++  java
  • python 播放 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)
    
    
  • 相关阅读:
    【机器学习】均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)
    python自动化测试框架nose
    python单元测试之unittest框架使用总结
    【flask】flask讲解
    Python查询手机号码归属地几种方法
    数据库的备份与恢复
    python中OrderedDict的使用
    python struct 结构体
    【Linux】linux-nfs挂载
    【机器学习】方差为何除以n-1
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5856950.html
Copyright © 2011-2022 走看看