javascript - ffmpeg - 结束功能可能无法正常工作?
问题描述
让这段代码遍历一些 .mp4 文件并创建它们的屏幕截图:
files.forEach(file => {
console.log(file);
if(!fs.existsSync('img/' + file.replace('.mp4', '.png'))) {
ffmpeg({ source: 'movies/' + file})
.takeScreenshots({ timemarks: [ '50' ], size: '150x100' }, 'img/', function(err, filenames) {
})
.on('end', function() {
fs.rename('img/tn.png', 'img/' + file.replace('.mp4', '.png'), function(err) {if (err) console.log('Error: ' + err) });
sleep(1000);
})
}
});
现在我遇到了一个问题,似乎 .on(end) 有时不起作用,错误: ENOENT:没有这样的文件或目录,重命名
我认为这是因为保存 tn.png 的过程比重命名要慢...
解决方案
我不会将回调、同步、睡眠和循环混合在一起。您可以使用fs
Promise 版本将所有回调样式转换为 Promise 样式。您可以按顺序或并行进行。
另外,我会说将屏幕截图代码转换为承诺。
这是代码
const fs = require("fs").promises;
function takeScreenshot(file) {
return new Promise((resolve, reject) => {
ffmpeg({"source": `movies/${file}`})
.takeScreenshots({"timemarks": ["50"], "size": "150x100"}, "img/", function (err, filenames) {
})
.on("end", function () {
resolve();
})
.on("error", err => {
reject(err);
});
});
}
// execute one by one
async function sequential(files) {
for (const file of files) {
const fileExists = await fs.stat(`img/${file.replace(".mp4", ".png")}`);
if (fileExists) {
await takeScreenshot(file);
await fs.rename("img/tn.png", `img/${ file.replace(".mp4", ".png")}`);
}
}
}
// execute in parallel
async function parallel(files) {
return Promise.all(files.map(async file => {
const fileExists = await fs.stat(`img/${file.replace(".mp4", ".png")}`);
if (fileExists) {
await takeScreenshot(file);
await fs.rename("img/tn.png", `img/${ file.replace(".mp4", ".png")}`);
}
}));
}
希望这可以帮助。
推荐阅读
- java - 如何解密 SMIME 邮件 smime.7ps 文件 - java mail
- javascript - React java脚本:IF函数仅在单击按钮时有效
- java - 从 Lombok 工具将 Stream<> 映射到 @value 类的实例
- javascript - 无法访问全局数组并将其写入 csv
- python - 如果单击 QTableView 内的空白区域,如何防止弹出上下文菜单?
- java - 注入由枚举值键入的接口实现映射
- python - 如何根据熊猫的每日数据记录获取相应年份的列值和周数的每周平均值
- javascript - 动态生成的元素不触发事件监听器
- ios - 在等待属性初始化的 init 中调用函数
- database - hybris - 一对多和多对多关系