如何同步执行ffmpeg命令?
How to execute ffmpeg commands synchronously?
我有一个视频处理 API,我想 运行 ffmpeg 命令同步,否则处理的文件会损坏。
到目前为止,我尝试了以下步骤:
var execute = (command) => {
const ffmpeg = spawn("./bin/ffmpeg/ffmpeg", command);
ffmpeg.stderr.on("data", (data) => {
debug(data.toString());
});
ffmpeg.on("close", () => {
console.log('DONE');
});
};
var sourceFilePath = '/tmp/test.mp4';
var outputPath = '/tmp/test_processed.mp4';
var ss = 5;
var t = 10;
execute([
"-i",
sourceFilePath,
"-ss",
ss,
"-t",
t,
outputPath,
]);
await uploadTos3(outputPath); // Helper function to upload processed file to s3
上传的文件无法使用。它已损坏。
注意:
当我尝试上传工作视频时,它正在工作。所以问题出在ffmpeg辅助函数上。
我认为您应该将 execute
函数转换为:
exports.execute = async (command) => {
return new Promise((resolve, reject) => {
const ffmpeg = spawn("./bin/ffmpeg/ffmpeg", command);
ffmpeg.once('error',reject);
ffmpeg.stderr.on("data", (data) => {
debug(data.toString(); //I'm not sure what debug is
});
ffmpeg.on("exit", (code,signal) => {
if(signal)
code = signal;
if(code != 0) {
reject(new Error(`Returned exit code ${code}`);
console.log('Error');
}
else {
resolve(); // Call resolve here
console.log('DONE');
}
});
});
};
await execute([ // Call function with `await`
"-i",
sourceFilePath,
"-ss",
ss,
"-t",
t,
outputPath,
]);
我有一个视频处理 API,我想 运行 ffmpeg 命令同步,否则处理的文件会损坏。
到目前为止,我尝试了以下步骤:
var execute = (command) => {
const ffmpeg = spawn("./bin/ffmpeg/ffmpeg", command);
ffmpeg.stderr.on("data", (data) => {
debug(data.toString());
});
ffmpeg.on("close", () => {
console.log('DONE');
});
};
var sourceFilePath = '/tmp/test.mp4';
var outputPath = '/tmp/test_processed.mp4';
var ss = 5;
var t = 10;
execute([
"-i",
sourceFilePath,
"-ss",
ss,
"-t",
t,
outputPath,
]);
await uploadTos3(outputPath); // Helper function to upload processed file to s3
上传的文件无法使用。它已损坏。
注意: 当我尝试上传工作视频时,它正在工作。所以问题出在ffmpeg辅助函数上。
我认为您应该将 execute
函数转换为:
exports.execute = async (command) => {
return new Promise((resolve, reject) => {
const ffmpeg = spawn("./bin/ffmpeg/ffmpeg", command);
ffmpeg.once('error',reject);
ffmpeg.stderr.on("data", (data) => {
debug(data.toString(); //I'm not sure what debug is
});
ffmpeg.on("exit", (code,signal) => {
if(signal)
code = signal;
if(code != 0) {
reject(new Error(`Returned exit code ${code}`);
console.log('Error');
}
else {
resolve(); // Call resolve here
console.log('DONE');
}
});
});
};
await execute([ // Call function with `await`
"-i",
sourceFilePath,
"-ss",
ss,
"-t",
t,
outputPath,
]);