如何循环使用动态数据的链式方法?
How to loop through chained methods with dynamic data?
使用 fluent-ffmpeg
,我有一个动态视频列表,我正尝试使用 Node.js 拼接在一起。下面的代码有效,但是是手动硬写的。我如何将它变成带有链接函数的循环?
我调查了 eval()
并且无法让它工作,并且不确定链式承诺是否是我正在寻找的(不确定在这里做什么)。
ffmpeg()
.input('video/video_after0.mp4')
.input('video/video_after1.mp4')
.input('video/video_after2.mp4')
.input('video/video_after3.mp4')
.input('video/video_after4.mp4')
.input('video/video_after5.mp4')
.input('video/video_after6.mp4')
.input('video/video_after7.mp4')
.input('video/video_after8.mp4')
.input('video/video_after9.mp4')
.input('video/video_after10.mp4')
.input('video/video_after11.mp4')
.input('video/video_after12.mp4')
.input('video/video_after13.mp4')
.input('video/video_after14.mp4')
.input('video/video_after15.mp4')
.input('video/video_after16.mp4')
.input('video/video_after17.mp4')
.input('video/video_after18.mp4')
.input('video/video_after19.mp4')
.input('video/video_after20.mp4')
.input('video/video_after21.mp4')
.input('video/video_after22.mp4')
.input('video/video_after23.mp4')
.input('video/video_after24.mp4')
.input('video/video_after25.mp4')
.input('video/video_after26.mp4')
.input('video/video_after27.mp4')
.input('video/video_after28.mp4')
.input('video/video_after29.mp4')
.input('video/video_after30.mp4')
.input('video/video_after31.mp4')
.input('video/video_after32.mp4')
.input('video/video_after33.mp4')
.input('video/video_after34.mp4')
.on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
这是我尝试使用 eval()
但它不起作用:
var ffmpegInputCommand = "ffmpeg()";
// For Loop to create the ffmpeg().input() command for multiple inputs:
async.forEach(array, function(data, done) {
if (data.id < array.length - 1) {
ffmpegInputCommand += ".input('" + videoAfter + data.id + ".mp4')";
}
done();
}, function (err) {
if (err) throw err;
else {
eval(ffmpegInputCommand).on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
}
});
// End: For-Loop
}
变量是在上述代码之前定义的。
为什么不做一个简单的循环?
start = 0;
max = 35;
while (start < max) {
fname = 'video/video_after'+str(start)+'.mp4'
ffmpeg().input(fname)
start += 1;
}
如果由于某些原因必须链接,您可以尝试以下操作:
var i = 0;
var ffmpeg = ffmpeg();
while (i < 35) {
ffmpeg = ffmpeg.input('video/video_after'+str(start)+'.mp4');
i++;
}
ffmpeg.on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
如果您确实需要将 input()
链接到 return 值或前面的 input()
,我建议使用 reduce()
。您绝对不需要使用 eval()
.
- 构建一个包含要串联的文件的数组。
reduce()
他们到 ffmpeg()
- 像往常一样附加您的订阅者
- 链接
mergeToFile()
调用。
考虑以下几点:
let files = [];
for (let i = 0; i < 34; i++) {
files.push(`video/video_after${i}.mp4`);
}
files
.reduce((prev, curr) => prev.input(curr), ffmpeg())
.on("error", err => console.log(`An error occurred while merging video files: ${err.message}`))
.on("end", () => {
logger.info("****** STEP 6 ENDED ******");
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
我认为你的挂断是"how do I construct a dynamic list of varying strings"。根据上面的示例,您可以使用循环和字符串连接,甚至模板文字。我不确定 callback
在哪里定义,但我认为它按预期工作。
使用 fluent-ffmpeg
,我有一个动态视频列表,我正尝试使用 Node.js 拼接在一起。下面的代码有效,但是是手动硬写的。我如何将它变成带有链接函数的循环?
我调查了 eval()
并且无法让它工作,并且不确定链式承诺是否是我正在寻找的(不确定在这里做什么)。
ffmpeg()
.input('video/video_after0.mp4')
.input('video/video_after1.mp4')
.input('video/video_after2.mp4')
.input('video/video_after3.mp4')
.input('video/video_after4.mp4')
.input('video/video_after5.mp4')
.input('video/video_after6.mp4')
.input('video/video_after7.mp4')
.input('video/video_after8.mp4')
.input('video/video_after9.mp4')
.input('video/video_after10.mp4')
.input('video/video_after11.mp4')
.input('video/video_after12.mp4')
.input('video/video_after13.mp4')
.input('video/video_after14.mp4')
.input('video/video_after15.mp4')
.input('video/video_after16.mp4')
.input('video/video_after17.mp4')
.input('video/video_after18.mp4')
.input('video/video_after19.mp4')
.input('video/video_after20.mp4')
.input('video/video_after21.mp4')
.input('video/video_after22.mp4')
.input('video/video_after23.mp4')
.input('video/video_after24.mp4')
.input('video/video_after25.mp4')
.input('video/video_after26.mp4')
.input('video/video_after27.mp4')
.input('video/video_after28.mp4')
.input('video/video_after29.mp4')
.input('video/video_after30.mp4')
.input('video/video_after31.mp4')
.input('video/video_after32.mp4')
.input('video/video_after33.mp4')
.input('video/video_after34.mp4')
.on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
这是我尝试使用 eval()
但它不起作用:
var ffmpegInputCommand = "ffmpeg()";
// For Loop to create the ffmpeg().input() command for multiple inputs:
async.forEach(array, function(data, done) {
if (data.id < array.length - 1) {
ffmpegInputCommand += ".input('" + videoAfter + data.id + ".mp4')";
}
done();
}, function (err) {
if (err) throw err;
else {
eval(ffmpegInputCommand).on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
}
});
// End: For-Loop
}
变量是在上述代码之前定义的。
为什么不做一个简单的循环?
start = 0;
max = 35;
while (start < max) {
fname = 'video/video_after'+str(start)+'.mp4'
ffmpeg().input(fname)
start += 1;
}
如果由于某些原因必须链接,您可以尝试以下操作:
var i = 0;
var ffmpeg = ffmpeg();
while (i < 35) {
ffmpeg = ffmpeg.input('video/video_after'+str(start)+'.mp4');
i++;
}
ffmpeg.on('error', function(err) {
console.log('An error occurred while merging video files: ' + err.message);
})
.on('end', function() {
logger.info('****** STEP 6 ENDED ******');
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
如果您确实需要将 input()
链接到 return 值或前面的 input()
,我建议使用 reduce()
。您绝对不需要使用 eval()
.
- 构建一个包含要串联的文件的数组。
reduce()
他们到ffmpeg()
- 像往常一样附加您的订阅者
- 链接
mergeToFile()
调用。
考虑以下几点:
let files = [];
for (let i = 0; i < 34; i++) {
files.push(`video/video_after${i}.mp4`);
}
files
.reduce((prev, curr) => prev.input(curr), ffmpeg())
.on("error", err => console.log(`An error occurred while merging video files: ${err.message}`))
.on("end", () => {
logger.info("****** STEP 6 ENDED ******");
callback(null);
})
.mergeToFile('video/video_after.mp4', '/video/temp');
我认为你的挂断是"how do I construct a dynamic list of varying strings"。根据上面的示例,您可以使用循环和字符串连接,甚至模板文字。我不确定 callback
在哪里定义,但我认为它按预期工作。