【问题标题】:Fluent-ffmpeg won't process/do anything with videos - NodejsFluent-ffmpeg 不会处理/对视频做任何事情 - Nodejs
【发布时间】:2021-03-06 06:20:02
【问题描述】:

我有这个代码:

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') 实际上会立即发送,因此清除也没有运行,没有错误,而且我知道该函数正在运行,因为我已将调试语句放入其中...仍然没有。

【问题讨论】:

  • @kg99 对不起,忘了说,我也是这样,还是没有。我只是在我的问题中加上“改变了承诺”。如果您愿意,我也可以添加该代码>
  • 等待承诺。
  • 类似 try { await processVideo(localTempPath);返回 res.send("完成"); } catch (err) { return res.send(err); }
  • @kg99 恐怕还是不行。
  • 会发生什么?你得到输出了吗

标签: javascript node.js express ffmpeg fluent-ffmpeg


【解决方案1】:

几个问题。你不是在等待 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.
  });

【讨论】:

  • 我尝试了您的版本和我所做的承诺版本,但它仍然无法正常工作。没有错误或输出。我将在一秒钟内用两个新的更新来更新我的答案
  • 会发生什么。你有错误吗?是否有来自 processVideo 功能的日志。你需要具体。
  • 我在第一条评论中声明没有错误或登录任何功能...我添加了调试日志并且它们正在运行,因此该功能正在运行
  • 这意味着您在使用 fluent-ffmpeg 时遇到了问题。您使用的是什么类型的视频?
  • 当 ffmpeg 没有说明存在错误时,你将如何调试它?
猜你喜欢
  • 2017-04-23
  • 2020-04-26
  • 2021-01-07
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
相关资源
最近更新 更多