首先,您需要弄清楚如何将ffmpeg与您的应用捆绑在一起。这里是a thread我开始在OSX应用程序的前端。捆绑的Windows分配需要遵循不同的程序:
- 打开电子基础文件夹(电子快速启动是默认的名称),然后进入node_modules文件夹。在那里创建一个名为ffmpeg的文件夹,并将静态二进制文件复制到此目录中。注意:它必须是静态版本,请抓住最新的Windows版本here。
在您的node_modules文件夹中,导航到.bin子文件夹。您需要在这里创建几个文本文件来告诉节点包含刚才复制的二进制exe文件。使用您喜欢的文本编辑器,并创建两个文件,一个名为ffmpeg
具有以下内容:
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/../ffmpeg/ffmpeg" "[email protected]"
ret=$?
else
node "$basedir/../ffmpeg/ffmpeg" "[email protected]"
ret=$?
fi
exit $ret
而第二个文本文件,命名为ffmpeg.cmd
:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\ffmpeg\ffmpeg" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\ffmpeg\ffmpeg" %*
)
接下来,您可以运行的ffmpeg在您的Windows电子分布中(在renderer.js中)如下所示(我也在使用app-root-dir节点模块):
var appRootDir = require('app-root-dir').get();
var ffmpegpath = appRootDir + '\\node_modules\\ffmpeg\\ffmpeg';
//filelist[] has already been populated
const
spawn = require('child_process').spawnSync;
for (var i = 0; i < filelist.length; i++) {
var outfile = filelist[i] + '.mp4';
var ffmpeg = spawn('cmd.exe', ['/c', '"'+ffmpegpath+ '"', '-i', filelist[i], '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-y', outfile]));
//add whatever switches you need here, test command line first
ffmpeg.stdout.on('data', data => {
console.log(`stdout: ${data}`);
});
ffmpeg.stderr.on('data', data => {
console.log(`stderr: ${data}`);
});
}
我确实看到了捆绑它的线程,但这些命令在Windows上不起作用。 “cp”和“ln”被拒绝。他们是否为不同的操作系统? -谢谢! –
我已经添加了Windows dist的代码。 – UltrasoundJelly
请注意,我在此使用'spawnSync'而不是'spawn',从而有效地使此代码阻塞/同步。在整个循环完成之前,您将无法更新UI。如果你想设置某种UI进度条,那么你需要使用带有promise队列的异步'spawn'命令。 – UltrasoundJelly