Nodejs:从视频缓冲区(不是文件路径)生成缩略图

2023-11-29

我有一个 Node API,它接受通过客户端 FormData 上传的视频文件。结果是req.file object:

{
  fieldname: 'media',
  originalname: 'IMG_6288.MOV',
  encoding: '7bit',
  mimetype: 'video/quicktime',
  buffer: <Buffer 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00 71 74 20 20 00 00 00 08 77 69 64 65 01 ed db 13 6d 64 61 74 21 20 03 40 68 1c 21 4e e6 ff f9 80 e7 ff ... 32390609 more bytes>,
  size: 32390659
}

我正在尝试从视频文件中的给定帧创建缩略图。 然而,我在缩略图生成(即 ffmpeg)中发现的几乎所有内容都需要一个路径来处理视频,但未提供该路径。

有没有办法创建没有文件路径的缩略图?也许直接从提供的缓冲区中或先将其转换为流?

TIA 为您提供帮助


我用下面的代码让它工作。 这并不完美,有时会抛出一个EPIPE错误,因为 ffmpeg 将标准输入关闭得很快,但它的工作原理和为您的用例奠定了坚实的基础:

const { exec } = require("child_process");
const fs = require("fs");

// this (data) is your input file, that you pipe into ffmepg
const data = fs.readFileSync("./input.avi");
console.log("input data read, size:", data.length);



const ffmpeg = exec(`ffmpeg -ss 00:10:00 -y -f avi -i pipe: -vframes 1 output.jpg`);

ffmpeg.on("error", (err) => {
    console.log("FFMEPG-ERROR", err)
});

ffmpeg.on("close", (code) => {
    console.log("ffmepg exited", code);
});

ffmpeg.stdin.on("error", (err) => {
    if (err.code === "EPIPE") {

        // ignore EPIPE error
        // throws sometimes a EPIPE error, ignore as long ffmpeg exit with code 0

    } else {
        console.log("ffmepg stdin error", err);
    }
});

ffmpeg.stdin.write(data);

基本上生成 ffmpeg,从标准输入读取,-i pipe: or -i -,并开始将数据泵入标准输入。

要测试 ffmpeg 命令,您可以运行以下命令。 这会在 10 秒处创建输入数据的缩略图。 请记住调整文件类型(-f选项)来匹配您的输入数据,因为 ffmpeg 在从标准输入读取时无法自动检测到它。 这-y标志是覆盖已经存在的输出文件。

cat input.avi | ffmpeg -ss 00:10:00 -y -f avi -i pipe: -vframes 1 output.jpg

有些人提到使用-ss作为寻求速度更快的第一个选项,但对我的测试没有影响。您可以在这里阅读更多内容:https://stackoverflow.com/a/27573049/5781499

如果您需要任何进一步的帮助,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs:从视频缓冲区(不是文件路径)生成缩略图 的相关文章

随机推荐