NodeJS:从视频缓冲区(非文件路径)生成缩略图 [英] Nodejs: generating thumbnail image from video buffer (not file path)

查看:18
本文介绍了NodeJS:从视频缓冲区(非文件路径)生成缩略图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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寻求您的帮助

推荐答案

我用以下代码解决了这个问题。 这并不完美,有时会抛出EPIPE错误,因为ffmpeg将stdin关闭得太快,但它的工作和使用情况为您的用例奠定了坚实的基础:

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在从stdin读取时无法自动检测到它。 -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

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

这篇关于NodeJS:从视频缓冲区(非文件路径)生成缩略图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆