#1367 | 2024-11-28 18:12:37

接上条,自从编译出想要的mpv后,就想着编译个iina只是举手之劳,没想到今天试了试才发现,事情没那么简单。。

iina的GitHub仓库是有配置构建的workflow的,理论上只要修改下它的构建脚本,将它依赖的libmpv替换自己构建的就行了。

但是我fork之后构建出的最新版本iina虽然能在我的mac 10.15上打开,可播放任意文件都会闪退。一开始以为是我修改造成的问题,于是从iina官方仓库的action里下载了最新版本,结果也是一样……

没办法只好手动checkout到上一次稳定版本的commit,然后再跑一次构建脚本,这次在下载依赖包的环节就失败了。。由此可见现代软件构建链的脆弱性,太多环境太多版本了。。


从头构建暂时走不通,就想办法直接改本地的app。

众所周知.app文件其实是个特定结构的文件夹,iina也不例外,而iina.app里面恰好就有一个libmpv.2.dylib,这个文件我已经构建出来了能播放hevc flv的版本,就在这个链接里(libmpv-x86_64-45c1c58.zip)。

所以问题就成了怎样将iina.app里的libmpv.2.dylib替换成我们自己构建的

直接替换好像不行,app直接打不开,我折腾半天又是codesign又是xattr,还是行不通,实在搞不懂mac的安全策略。。

最终在otool的帮助下发现了线索,otool -L /Applications/IINA.app/Contents/MacOS/IINA可以查看它依赖的dylib,里面就有我们的目标libmpv,于是先执行

install_name_tool -change @rpath/libmpv.2.dylib /Users/me/code/github/mpv-mac/temp/libmpv.2.dylib /Applications/IINA.app/Contents/MacOS/IINA

将二进制IINA中引用的libmpv链接重定向到本地下载好的新构建的dylib文件

这样还没完,因为otool分析这个新构建的libmpv.2.dylib会发现它还引用了一个libluajit-5.1.2.dylib,这个文件的路径/Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib在我的本地mac上找不到,但也在libmpv-x86_64-45c1c58.zip这个压缩包里。所以需要再执行下install_name_tool:

install_name_tool -change /Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib /Users/me/code/githubx/mpv-mac/temp/libluajit-5.1.2.dylib libmpv.2.dylib

# 此外二进制IINA也引用了libluajit,所以也顺带改下
install_name_tool -change @rpath/libluajit-5.1.2.dylib /Users/me/code/github/mpv-mac/temp/libluajit-5.1.2.dylib /Applications/IINA.app/Contents/MacOS/IINA

依赖问题解决后,再执行一遍codesign -s - -f /Applications/IINA.app

这样就能成功打开iina.app了,而且它内部调用的libmpv也变成了我们自己构建的版本,所以也能成功打开hevc的flv文件了。