1. 问题
按照上一篇文档的步骤编译之后,发现mp3格式的背景音乐无法播放。通过直接执行vcmiclient
可以看到在控制台中输出如下信息:
1Warning: Cannot open Music/MainMenu: Unrecognized audio format
2Unable to play music (music parameter was NULL)
原因是我本地环境使用的sdl2_mixer
是通过brew安装的,当时无法按照官方文档介绍通过brew install sdl2_mixer --with-smpeg2
进行安装。
因为发现无法播放mp3音乐,所以我对这个库进行了一些了解,发现brew官方的版本屏蔽了mp3格式的支持。查看brew官方的源码可以看到:
1def install
2 inreplace "SDL2_mixer.pc.in", "@prefix@", HOMEBREW_PREFIX
3
4 args = %W[
5 --prefix=#{prefix}
6 --disable-dependency-tracking
7 --disable-music-flac
8 --disable-music-flac-shared
9 --disable-music-midi-fluidsynth
10 --disable-music-midi-fluidsynth-shared
11 --disable-music-mod-mikmod-shared
12 --disable-music-mod-modplug-shared
13 --disable-music-mp3-mpg123
14 --disable-music-mp3-mpg123-shared
15 --disable-music-mp3-smpeg
16 --disable-music-ogg-shared
17 --enable-music-mod-mikmod
18 --enable-music-mod-modplug
19 --enable-music-ogg
20 ]
21
22 system "./configure", *args
23 system "make", "install"
24 end
可以看到有关mp3的选项都被disabled掉了。
2. 解决办法
brew
官方的版本不支持mp3,而且也不提供定制参数。所以只能通过手工编译源码的方式解决。可以使用brew --build-from-source
功能简化手工编译的过程。
下载上面的rb文件,编辑如下:
1...
2 # 经过验证,可以只增加 mpg123 这一个依赖库。
3 depends_on "mpg123"
4 # 经过验证,可以不添加smpeg2,但需要同时启用相应的disable选项
5 #depends_on "smpeg2"
6...
7# 屏蔽mp3有关的几个的几个disable选项,相当于启用mp3播放功能
8# 屏蔽mpg123选项,但是继续保留disable shared mpg123的选项,禁用动态链接
9# --disable-music-mp3-mpg123
10 --disable-music-mp3-mpg123-shared
11# 继续屏蔽smpeg2
12 --disable-music-mp3-smpeg
特别注意:
- 需要保留
--disable-music-mp3-mpg123-shared
这个选项,否则在libSDL2_mixer.dylib
的依赖表中无法看到libmpg123
,从而导致使用cpack打包的时候无法侦测到libmpg123
这个依赖库; - 猜测是因为屏蔽shared之后会使用动态加载动态库的方式,这种方式不会出现在依赖库列表中。
然后使用编译源码的方式安装:
1# 首先卸载已经安装的版本
2brew remove sdl2_mixer
3# 编译安装
4brew install --build-from-source ./sdl2_mixer
这样brew
就会读取本地的sdl2_mixer.rb
文件,并按照指定的参数进行编译安装了。安装成功之后的sdl2_mixer
提供mp3的支持。
不需要重新编译vcmi,直接运行之前编译成功的版本就可以发现mp3格式的背景音乐可以正常播放了!
附录、参考资料
更新记录
- 2020.07.06 明确只需要依赖mpg123这个库即可,明确编译方法。