python用os.system打开wav文件_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)

根据提供的引用内容,可以看出Python后端已经将录音文件以base64编码格式传输给了Java后端,而Java后端需要将其解码并转换成MP3文件。因此,我们需要先将base64编码的文件解码成二进制数据,然后再将其转换成wav文件。下面是一个可能的实现方法: 1. 首先,我们需要将base64编码的字符串转换成二进制数据。可以使用Java内置的Base64类来完成这个任务。具体代码如下: ``` byte[] decodedBytes = Base64.getDecoder().decode(base64String); ``` 其中,`base64String`是Python后端传输过来的base64编码的字符串。 2. 接下来,我们需要将二进制数据写入到一个wav文件中。可以使用Java内置的AudioSystem类来完成这个任务。具体代码如下: ``` AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(decodedBytes)); AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File("output.wav")); ``` 其中,`decodedBytes`是上一步解码得到的二进制数据,`output.wav`是输出的wav文件名。 综上所述,我们可以将Python传输过来的base64文件解码并转换成wav文件,具体实现方法如下: ``` // 将base64编码的字符串解码成二进制数据 byte[] decodedBytes = Base64.getDecoder().decode(base64String); // 将二进制数据写入到wav文件中 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(decodedBytes)); AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File("output.wav")); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值