【问题标题】:FFMPEG multiple screenshots commandFFMPEG 多截图命令
【发布时间】:2021-01-23 00:02:30
【问题描述】:

我正在尝试编写一个使用 ffmpeg 从视频文件创建图像的函数。

但现在我想知道如何使用 ffmpeg commands 准确地做到这一点,因为我使用包装器,现在我有一些限制,所以我必须以原生方式。

所以,首先我决定使用一个名为 node-fluent-ffmpeg 的 Wrapper。

这是我使用 Wrapper 的解决方法:

ffmpeg({
        source: `The video file...`,
      })
        .on("filenames", async (filenames) => {
        })
        .on("error", function (err) {
          console.log("Error in filenames section: " + JSON.stringify(err));
        })
        .on("end", function () {
          console.log("Screenshots taken");
        })
        .screenshots({
          count: 60,
          folder: "tmp/",
          filename: "thumbnail-at-%i.png",
          size: "1600x900",
        })
        .on("end", function (stdout, stderr) {
            let newImg = await fs.createReadStream(`/tmp/${img}`);
            destparams = await {
              Bucket: dstBucket,
              Key: "uploaded-" + img,
              Body: newImg,
              ContentType: "image",
            };
           await s3.putObject(destparams).promise();

});

为了更好地理解我的注意事项:

  • 我仍然想在 node.js 中制作它

  • 假设文件是​​:“视频文件...”

  • 我正在以随机方式从视频中截取 60 张截图,喜欢它 不管视频的长度如何,从开始到结束只需要 60 张截图。

  • 每张截图都会有一个前缀和有序的数字和名称。 例如: thumbnail-at-1.png、thumbnail-at-2.png、thumbnail-at-3.png 并继续直到达到 60 个屏幕截图的限制。

  • 每张截图都会以 1600x900 的分辨率保存。

  • 每张截图都会保存在 TMP 文件夹中。

  • 不要介意阅读此内容:毕竟我会将每个屏幕截图上传到 s3 存储桶。

  • 我搜索了很多旧论坛,但似乎 ffmpeg 有 一个糟糕的文档(我被卡住了,很难理解)。

所以我的主要目标是:

如何使用 FFMPEG 命令准确地实现我在代码示例和快速注释中显示的功能? (不使用包装)

(对不起,我试图让它更简单)

我的意思是,我必须使用哪些命令,以及以下代码示例中的 FFMPEG 命令?

顺便说一句:是node.js,

真的不知道该怎么办,抱歉

spawnSync(
      "/opt/ffmpeg/ffmpeg",
      [
        "-i",
        ``,
        "-f",
        "",
        ``
      ],
      { stdio: "inherit" }
 );

感谢您的耐心等待!

环境:

  • Node.js 12.x
  • FFMPEG (4.3.1)

【问题讨论】:

    标签: javascript node.js amazon-web-services ffmpeg fluent-ffmpeg


    【解决方案1】:

    主要问题是获取视频的持续时间,所以只要你有 ffprobe 你应该能够做到这一点:

    获取持续时间然后除以 60,将数字转换为时间戳

    ffprobe -v quiet -print_format json -show_format -show_streams "<FILENAME>"

    然后解析format.duration的JSON,然后除以你想要的屏幕数。

    然后通过执行dateformat('H:i:s', i * (format.duration / 60))(伪)循环超过 60 次以获得特定时间戳的单个帧:

    ffmpeg -ss 00:00:00 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-0.png"
    ffmpeg -ss 00:00:10 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-1.png"
    ffmpeg -ss 00:00:20 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-2.png"
    ...
    ffmpeg -ss 00:09:30 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-57.png"
    ffmpeg -ss 00:09:40 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-58.png"
    ffmpeg -ss 00:09:50 -i "infile.mp4" -t 00:00:01 -r 1 -f mjpeg "thumbnail-at-59.png"
    

    【讨论】:

    • 哇,伙计,谢谢但是,我只有两个问题: 1-使用该命令,我如何以特定分辨率截取这些屏幕截图? 2--r 和 -f mjpeg 是什么意思? (对不起,我是原生ffmpeg的菜鸟)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2020-05-03
    • 2016-08-19
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多