我想使用fluent-ffmpeg模块使用Electron的复杂过滤器调用ffmpeg,但没有成功。错误'[AVFilterGraph @ 0xb8 .......]没有这样的过滤器“错误初始化复杂过滤器。无效参数'与此问题Error : Running FFmpeg command in Android ,splitting command in array not working中的相同,但上下文不同。
需要什么? 使用fluent-ffmpeg:
运行此ffmpeg命令ffmpeg -i safework-background-0.mp4 -i image1.png -i image2.png -i image3.png -filter_complex“[0:v] [1:v] overlay = 1:1:enable ='between(t,5,8.5)'[tmp]; [TMP] [2:V] overlay = 1:1:enable ='between(t,8.5,12)'[tmp]; [TMP] [3:V] overlay = 1:1:enable ='between(t,12,15)'“test-video-safework3.mp4
它使用复杂的滤镜按顺序叠加视频上的三个图像并导出新视频。
哪些不起作用? 显然流畅的ffmpeg扼流圈带有复杂滤波器的必要引号,这是我的结论(和上面的Android变体问题相同)。
Electron中没有fluent-ffmpeg的方法有效吗? 你可以猜到我不得不直接打电话给ffmpeg。为帮助他人,以下命令(输入和输出视频文件名已参数化)转换为Electron:
var spawn = require('child_process').spawn
var fargs = ['-y', '-i', sourceDir.path() + '/' + inVideoName, '-i', tempDir.path() + '/' + 'image1.png',
'-i', tempDir.path() + '/' + 'image2.png', '-i', tempDir.path() + '/' + 'image3.png',
'-filter_complex', '[0:v][1:v]overlay=1:1:enable=\'between(t,5,8.5)\'[tmp];' +
'[tmp][2:v]overlay=1:1:enable=\'between(t,8.5,12)\'[tmp];[tmp][3:v]' +
'overlay=1:1:enable=\'between(t,12,15)\'', targetDir.path() + '/' + outVideoName]
var ffmpeg = spawn(ffmpegc, fargs, { cwd:jetpack.cwd(app.getPath('home')).path() })
// some code ommitted
ffmpeg.on('close', (code) => {
console.log(`child process exited with code ${code}`)
webContents.send('notify-user-reply', 'Video processing done.')
})
上面的命令已经删除了每个图像的各种过滤器(在复杂过滤器中)之间的空格,否则它也会窒息。
我真的很想在Electron中使用fluent-ffmpeg,不仅仅是为了方便更优雅地调用ffmpeg而且还有一些额外的功能,比如简单的进度报告。