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

Posted

技术标签:

【中文标题】Nodejs:从视频缓冲区(不是文件路径)生成缩略图【英文标题】:Nodejs: generating thumbnail image from video buffer (not file path) 【发布时间】:2021-12-17 22:02:18 【问题描述】:

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


  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 为您提供帮助

【问题讨论】:

您可以在 ffmpeg 进程中将该文件/数据通过管道传输/写入到标准输入。有了这个,您不必将文件写入文件系统。所有“内存中”。 @Marc 你能举个例子吗?视频处理/ffmpeg 的新手 抱歉让您久等了。我已经发布了一个可能的解决方案。 【参考方案1】:

我用下面的代码让它工作。 这并不完美,有时会引发 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);

基本上生成 ffmepg,从 stdin、-i pipe:-i - 读取,并开始将数据泵入 stdin。

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

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

有人提到使用-ss作为第一选项以更快地寻找,但这对我的测试没有影响。你可以在这里阅读更多:https://***.com/a/27573049/5781499

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

【讨论】:

以上是关于Nodejs:从视频缓冲区(不是文件路径)生成缩略图的主要内容,如果未能解决你的问题,请参考以下文章

如何创建从Android视频文件路径视频缩略图

如何同时将视频上传到 s3 为其创建缩略图并使用 nodejs 将其保存到同一存储桶中的另一个文件夹中?

从 YouTube API 中获得 YouTube 视频的缩略图

使用 ffmpeg 或其他软件从视频中每个场景变化的中间生成缩略图

安装 FFMPEG 以从虚拟主机上的视频文件生成缩略图

使用ffmpeg生成视频缩略图;从 RTMP 服务器抓取