gpt4 book ai didi

node.js - 在将它们与 FFmpeg 连接之前如何检查文件是否损坏?

转载 作者:行者123 更新时间:2023-12-04 23:07:13 42 4
gpt4 key购买 nike

我正在使用 child_process在 NodeJS 中打包以运行 FFmpeg 以连接一些视频。我用于连接的命令是:

ffmpeg -f concat -i list_file.txt -c copy final.mp4
list_file.txt是视频文件的列表,它包含:
file '700010023590099933_1612945401707.mp4'
file '700010023590099933_1612945439023.mp4'
.
.
我想在连接它们之前检查每个视频,因为如果其中一个被损坏,它会停止该过程并引发错误。所以它也使最终的视频损坏。
此外,我可以使用以下命令检查视频文件是否正常:
ffmpeg -i input.mp4 -c copy -f null -; echo $?
返回 0如果文件正常并且 1如果不。
我想检查所有的视频文件,如果它们都正常,那么将它们连接起来。如果每个都已损坏,则将其排除并继续该过程。
有没有办法在一个命令中做到这一点?

最佳答案

您可以读取文本文件,对其进行解析并为每个视频文件生成一个测试过程。

const fs = require("fs");
const cp = require("child_process");

const fileContent = fs.readFileSync("./videos.txt", "utf8").split("\n").map((line) => {
return line.match(/'([^']+)'/)[1];
});


const filterd = fileContent.filter((file) => {

let corrupt = cp.execSync(`ffmpeg -i ./${file} -c copy -f null -; echo $?`, {
stdio: "pipe",
encoding: "utf8"
}).trim();

// corrupt = 0, file is ok, use it
// corrupt = 1, file is corrupt, ignore it
if (corrupt !== "0") {
return false;
} else {
return true;
}

});

// contains only fiels without error
console.log(filterd)
首先,通过 fs.readFileSync读取文件并对其进行一些字符串操作,仅获取我们需要/想要的文件名。
在解析后的文件中,生成了一个数组,我们可以在该数组上使用过滤器。
在过滤器条件中,我们简单地调用 ffmpeg 测试过程并进行基本的字符串比较以检查文件是否可用。 filterd数组只包含可以处理的文件名。
(如果要显示可以使用的文件,请使用 full)
现在,您可以从该数组中创建一个新文件或将其作为文件/输入参数直接传递给 ffmepg

var parseableFiles = "";

filterd.forEach((file) => {
parseableFiles += `file '${file}'\r\n`;
});

fs.writeFileSync("./filterd_files.txt", parseableFiles);
请注意,我编写了所有函数调用 syncron。这会阻塞事件循环。
还要记住新行 \r\n与其他操作系统不同。 -> https://en.wikipedia.org/wiki/Newline#Representation
在 Ubuntu 18.04LTS 上编码和测试。

关于node.js - 在将它们与 FFmpeg 连接之前如何检查文件是否损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66156540/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com