起因是我最近做的项目需要打包 ffmpeg 到 electron 中,奈何因为想要支持 m1芯片,引入ffmpeg的方案需要调整
问题点
ffmpeg引入的集中方案不支持基于arm的mac导致连安装抖麻烦- 引入的路径调用问题
- 优化包大小
ffmpeg引入方案
因为ffmpeg-static作者也说了,不打算支持m1的,所以也没有可能通过直接ffmpeg-static或者类似几个库直接安装了,不过也有一定好处,就是,如果通过事先安装到本地node_modules的话,如果在一个平台打包其他平台的构建包,会造成打包缺失文件,所以有以下几个方案
- 让用户自己装
ffmpeg- 不现实,得考虑用户水平 - 自己提供二进制文件
我采用的就是将二进制文件打进electron的方法,虽然无法升级ffmpeg的版本不过能保证多平台构建了,所以首先,得找到可以打进去的二进制文件
通过google, arm-mac以外的文件我们可以在ffbinaries.com/downloads 直接下载得到 arm的可以本地自行编译或者从www.osxexperts.net/下载得到
那electron怎么获取正确的ffmpeg二进制呢?
我们参考一下其他ffmpeg库,在项目根目录,新建ffmpeg文件夹,然后按照platform-arch的命名规则,建立每个系统对应的文件夹将ffmpeg存在其中,引用的时候,可以通过
import os from 'os'
import path from 'path'
import fs from 'fs'
const platofrm = os.platform()
const arch = os.arch()
const basePath = path.join(__static, '..', 'ffmpeg')
const ffmpegPath = path.join(basePath, `${platofrm}-${arch}`, `ffmpeg${platofrm === 'win32' ? '.exe' : ''}`)
export default ffmpegPath
这样,来获取正确地址,这里因为我用了vue-cli-plugin-electron-builder有提供__static, 其他可用app.getPath('exe')来替代
打包的时候也需要将二进制文件打包进去,在electron-builder中添加
{
"extraResources": ["./ffmpeg/${platform}-${arch}"]
}
即可,这样打包的时候会把二进制文件也打进去
记得之前建立文件夹的规则嘛?/${platform}-${arch}就是为了打包的时候只打对应平台的文件,减小包的体积
platform 和 arch 请自行查阅nodejs.cn/api/os.html…
总结
方法总是人想出来的,只不过可以用"./ffmpeg/${platform}-${arch}"的办法来减小体积确实找了很久,文档上也没有提可以使用模版字符串,有点坑
这个方法问题就在于二进制文件要手动维护,仓库大小吃紧了