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)

转载于:https://www.cnblogs.com/hhh5460/p/5856950.html

要使用Python读取wav文件,可以使用wave模块来实现。首先,你需要导入wave模块,并使用wave.open()函数打开wav文件。然后,你可以使用一些wave对象的方法来获取音频的相关信息,例如帧数、声道数、帧速率和比特宽度。接下来,你可以使用wave.readframes()方法读取所有的帧,并将其转换为数组矩阵形式。最后,你可以根据需要对数据进行处理或显示。 示例代码如下所示: ```python import wave import numpy as np import matplotlib.pyplot as plt def read_wav_data(filename): '''读取一个wav文件,返回声音信号的时域谱矩阵和播放时间''' wav = wave.open(filename,"rb") # 打开一个wav格式的声音文件流 num_frame = wav.getnframes() # 获取帧数 num_channel=wav.getnchannels() # 获取声道数 framerate=wav.getframerate() # 获取帧速率 num_sample_width=wav.getsampwidth() # 获取实例的比特宽度,即每一帧的字节数 str_data = wav.readframes(num_frame) # 读取全部的帧 wav.close() # 关闭流 wave_data = np.fromstring(str_data, dtype = np.short) # 将声音文件数据转换为数组矩阵形式 wave_data.shape = -1, num_channel # 按照声道数将数组整形,单声道时候是一列数组,双声道时候是两列的矩阵 wave_data = wave_data.T # 将矩阵转置 return wave_data, framerate def wav_show(wave_data, fs): # 显示出来声音波形 time = np.arange(0, len(wave_data)) * (1.0/fs) # 计算声音的播放时间,单位为秒 # 画声音波形 plt.plot(time, wave_data) plt.show() if(__name__=='__main__'): wave_data, fs = read_wav_data("1.wav") wav_show(wave_data[0],fs) wav_show(wave_data[1],fs) # 如果是双声道则保留这一行,否则删掉这一行 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值