繁体   English   中英

Fluent-ffmpeg 不会处理/对视频做任何事情 - Nodejs

[英]Fluent-ffmpeg won't process/do anything with videos - Nodejs

我有这个代码:

const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path;
const ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath(ffmpegPath);

app.put("/upload-content", async (req, res) => {
  // 1. Get video and save locally to the server
  const video = req.files.video;
  const localTempPath = "./tmp/" + video.name;
  video.mv(localTempPath, function (error) {
      if (error) return res.send(error);
  });
  // 2. Convert video and apply settings
  processVideo(localTempPath).catch((err) => {
    return res.send(err);
  });
  return res.send("done");
});

function processVideo(localTempPath) {
  return new Promise((resolve, reject) => {
    ffmpeg(localTempPath)
    .withVideoCodec("libx264")
    .withSize("630x320")
    .withOutputFormat("avi")
    .on("error", (error) => reject("Failed to process video: " + error))
    .on("progress", (progress) => console.log(progress))
    .on("end", resolve("Successfully processed video"))
    .saveToFile(localTempPath);
  });
}

没有任何效果,我尝试过移除音频,尝试更改视频编解码器,尝试输出而不是保存,尝试在承诺之外进行。 我也尝试过不同的路径等。当发送请求时, res.send('done')实际上会立即发送,因此清除也没有运行,没有错误,我知道该函数正在运行我已经把调试语句放在里面了......仍然什么都没有。

几个问题。 您不是在等待 mv 回调。 要么让它成为一个承诺,要么在它的回调之后运行代码。 尝试这个。

const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path;
const ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath(ffmpegPath);

app.put("/upload-content", async(req, res) => {
    try {
        // 1. Get video and save locally to the server
        const video = req.files.video;
        const localTempPath = "./tmp/" + video.name;
        video.mv(localTempPath, async function(error) {
            if (error) return res.send(error);
            const resp = await processVideo(localTempPath);
            return res.send("done");
        });

    } catch (err) {
        return res.send(error);
    }
});

function processVideo(localTempPath) {
     return new Promise((resolve, reject) => {
    ffmpeg()
        .input(localTempPath)
        .withVideoCodec("libx264")
        .withSize("630x320")
        .withOutputFormat("avi")
        .on("error", (error) => reject("Failed to process video: " + error))
        .output(newpath)
        .on("progress", (progress) => console.log(progress))
        .on('end', function() {
            console.log('Finished processing');
        })
        .run();
});;
}

要么让这个函数成为承诺,要么在它回调后执行。

video.mv(localTempPath, function (error) {
      if (error) return res.send(error);
 // save file if nothing went wrong. Also wait for processVideo to complete.
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM