以下命令对输入视频进行编码并输出out.mkv。
var default_settings = { "width":1920, "height":1080 };
var settings = Object.assign({}, default_settings);
var encoding_args = ["--of=mpegts", "--ovc=libx264", `--ovcopts=profile=main,preset=veryfast,level=4,crf=20,maxrate=5000k`, `--vf=lavfi=[format=yuv420p,yadif=mode=1:deint=1,scale=(iw*sar)*min(${settings.width}/(iw*sar)\\,${settings.height}/ih):ih*min(${settings.width}/(iw*sar)\\,${settings.height}/ih),pad=${settings.width}:${settings.height}:(${settings.width}-iw*min(${settings.width}/iw\\,${settings.height}/ih))/2:(${settings.height}-ih*min(${settings.width}/iw\\,${settings.height}/ih))/2]`, `--oac=aac`, `--oacopts=ac=2,b=160k`];
var mpv_args = ["input-video.mkv", "-v", '--no-config', '--log-file=mpv.log', ...encoding_args, "--o=out.mkv"];
console.log("mpv "+mpv_args.join(" "));
var mpv = child_process.spawn("mpv", mpv_args);
在命令提示符下,它完全可以正常运行相同的命令。如果我将参数连接到字符串中并使用child_process.exec,它会完美地工作。如果我使用child_process.spawn,它可以工作约5秒钟...然后编码会暂停。没有崩溃,没有出口,只是停顿。
[尝试使用节点10、12 + 13(Windows 10 64位)。所有人都存在问题。这是某种缓冲区限制问题吗?在仍然使用spawn的情况下如何解决?
看起来mpv
缓冲区已满。尝试从缓冲区读取,尽管您不对其执行任何操作。
const mpv = spawn('mpv',[/*arg1,arg2,.. */])
mpv.stdout.on('data', (data) => {
// read from buffer
});
mpv.stderr.on('data', (data) => {
// console.error(`this.mpvProcess stderr: ${data}`);
});
mpv.on('error', (err) => {
console.error('Failed to start child process.', err);
});