wxPython和pycairo练习记录19

Sound.py 播放音频文件 https://github.com/mx0c/super-mario-python/blob/5623213c2eb001d8dabd95eb7035d7545e86ccf6/classes/Sound.py
在 wxPython 中 wx.adv.Sound 只能播放 WAV 格式的文件,或者在 UI 中调用 wx.media.MediaCtrl 控件,但素材里的音频还有 OGG 格式的,没法用 wxPython 在后台播放。

pygame.mixer.Sound 使用的是 Simple DirectMedia Layer (SDL) 提供的接口,详情见:
https://www.libsdl.org/index.php
https://github.com/libsdl-org/SDL
https://github.com/pygame/pygame/blob/main/src_c/cython/pygame/_sdl2/mixer.pxd
https://www.pygame.org/docs/ref/mixer.html

在 pygame 安装目录 python3\Lib\site-packages\pygame 中有 SDL2_mixer.dll,应该可以通过它调用并播放多种格式音频。另外还有个 libogg-0.dll,不考虑扩展,这个应该才是需要的。
使用工具查看 dll 导出函数:
https://github.com/lucasg/Dependencies/releases/tag/v1.11.1
dll导出函数

libogg-0.dll 提供了对 OGG 容器格式的基本支持,可以用来读取和处理 OGG 文件的数据结构。好像没什么用,它的作用有点像为现实里的鸡蛋编写一个鸡蛋类。

OGG 文件中保存的是压缩后的音频数据,而不是解码后的原始音频数据。解码是将压缩的音频数据转换为原始的 PCM 数据的过程,编码则相反。PCM(Pulse Code Modulation)脉冲编码调制,是一种将模拟信号转换为数字信号的方法。

这里的目标是读取 OGG 文件中的压缩数据,解码为 PCM 数据,转换为 WAV 格式数据,最后转为 wx.adv.Sound 对象。 WAV 数据就是 WAV 文件头加上 PCM 字节数据。

找到另一个库:
https://github.com/xiph/vorbis
编译好的 dll,libvorbisfile-3.dll 依赖 libogg-0.dll 和 libvorbis-0.dll,所以三个都需要:
https://github.com/QutEcoacoustics/audio-analysis/blob/master/lib/audio-utils/win-x64/sox/libvorbisfile-3.dll
https://github.com/QutEcoacoustics/audio-analysis/blob/master/lib/audio-utils/win-x64/sox/libogg-0.dll
https://github.com/QutEcoacoustics/audio-analysis/blob/master/lib/audio-utils/win-x64/sox/libvorbis-0.dll

# 此代码不能正常运行,提示 OSError: exception: access violation writing 0x0062F564
import ctypes

# 加载 libvorbisfile-3.dll
vorbisfile_lib = ctypes.CDLL("./classes/libvorbisfile-3.dll")

# 定义函数参数类型
vorbisfile_lib.ov_open_callbacks.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p), ctypes.c_char_p, ctypes.c_long, ctypes.c_void_p]
vorbisfile_lib.ov_open_callbacks.restype = ctypes.c_int

vorbisfile_lib.ov_read.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_char), ctypes.c_int, ctypes.POINTER(ctypes.c_int
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值