背景
我在Electron+Vite+Vue3的桌面app中,Electron环境下使用到了fluent-ffmpeg。ts-node测试都没有问题,但加入electron/main.ts下后,就出现了这个问题:
Could not resolve “./lib-cov/fluent-ffmpeg” from “./lib-cov/fluent-ffmpeg?commonjs-external”
这个问题应该是导入之类的问题,也是一直没有找到解决方案。
采用了node-ffmpeg库,也是会报其他的错误。
Error: Could not dynamically require “./lib/decorators/timed”. Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.
解决方案
直接使用nodejs的child_process模块的exec直接调命令行,比如我这里的需求是生成视频首帧。
import { exec } from 'node:child_process'
function generateFirstFrame(videoPath: string, saveImagePath: string): Promise<string> {
return new Promise<string>((resolve, reject) => {
let cmd = `ffmpeg -y -i ${videoPath} -vframes 1 ${saveImagePath}`
exec(cmd, (error: any, stdout: any, stderr: any) => {
if (error) {
reject(error)
return
}
resolve(saveImagePath)
})
})
}
export { generateFirstFrame }
虽然直接调命令行需要自己封装一下,但也就不会遇到上面第三方库的问题了。
直接导入electron/main.ts下面也是可以使用的。
前提是先下好ffmpeg等库并加入环境变量。