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

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

最低0.47元/天 解锁文章
351





