3分钟提取10000个视频的第一帧图片,node执行ffmpeg万能脚本

Posted jalen2024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3分钟提取10000个视频的第一帧图片,node执行ffmpeg万能脚本相关的知识,希望对你有一定的参考价值。

先给电脑安装node环境

node官网地址:https://nodejs.org/en/

安装完成之后可以将node配置到系统环境变量中,

最后再检验自己node环境是否ok

➜  ~ node -v
v12.18.2

下载ffmpeg的安装包

官网地址:https://ffmpeg.org/

mac下载地址:https://evermeet.cx/ffmpeg/

windows下载地址:https://www.gyan.dev/ffmpeg/builds/

准备好脚本 全部代码如下

var fs = require('fs');
var path = require('path'); //解析需要遍历的文件夹

const ffmpeg = require('fluent-ffmpeg')
let cp = require('child_process');


console.log('准备开始处理')

var filePath = path.resolve('./vlist');
//调用文件遍历方法
fileDisplay(filePath);


//文件遍历方法
function fileDisplay(filePath) 
   //根据文件路径读取文件,返回文件列表
   fs.readdir(filePath, function(err, files) 
   	if (err) 
   		console.warn(err)
   	 else 
   		//遍历读取到的文件列表
   		files.forEach(function(filename) 
   			console.log('文件名:', filename);
   			//获取当前文件的绝对路径
   			var filedir = path.join(filePath, filename);
   			console.log('文件路径:', filename);
   			if (filename.indexOf('DS_Store') == -1) 
   				//这里预设的是 将转换的图片放在当前目录的images文件夹里 文件名是jpg后缀
   				execJpg(filedir, `$filePath/images/$filename.split('.')[0].jpg`)
   			
   		);
   	
   );


//提取视频第一帧 保存为图片
//pathFile:原文件地址
//saveFilePath:需要保存的文件地址 
const execJpg = (pathFile, saveFilePath) => 
   //这个指令也能转
   // const aa = `./ffmpeg -i $pathFile -y -f image2 -frames 1 $saveFilePath`
   // ./ffmpeg -ss 00:00:00 -t 00:00:01 -i f9.mp4 -an -f image2 -s 640:1136 a123.jpeg
   const bb = `./ffmpeg -ss 00:00:00 -t 00:00:01 -i $pathFile -an -f image2 -s 640:1136 $saveFilePath`
   console.log('当前指令:', bb)
   cp.exec(bb,
   	function(res) 
   		console.log('执行的结果:', JSON.stringify(res))
   		console.log(`$saveFilePath success...`)
   	)


console.log('处理结束')


准备需要转换的mp4文件列表

将脚本文件、ffmpeg、 mp4文件夹放在同一个文件夹下

命令行切换到该目录 并配置运行环境

➜  ~ cd /Users/jalen/Desktop/inv/ffmpeg

脚本中有用到fluent-ffmpeg,所以需要安装下

npm install fluent-ffmpeg

➜  vlist npm install fluent-ffmpeg
npm WARN saveError ENOENT: no such file or directory, open '/Users/jalen/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/Users/jalen/package.json'
npm WARN svg-inline-react@1.0.3 requires a peer of react@^0.14.0 || ^15.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN uview@0.1.0 requires a peer of vue@^2.4.1 but none is installed. You must install peer dependencies yourself.
npm WARN jalen No description
npm WARN jalen No repository field.
npm WARN jalen No README data
npm WARN jalen No license field.

+ fluent-ffmpeg@2.1.2
added 3 packages from 3 contributors in 3.668s

6 packages are looking for funding
 run `npm fund` for details



  ╭────────────────────────────────────────────────────────────────╮
  │                                                                │
  │      New major version of npm available! 6.14.11 → 8.19.2      │
  │   Changelog: https://github.com/npm/cli/releases/tag/v8.19.2   │
  │               Run npm install -g npm to update!                │
  │                                                                │
  ╰────────────────────────────────────────────────────────────────╯

➜  vlist

执行脚本命令

➜ ffmpeg node transVideo2Jpg.js

准备开始处理
处理结束
文件名: .DS_Store
文件路径: .DS_Store
文件名: a1.mp4
文件路径: a1.mp4
当前指令: ./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a1.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a1.jpg
文件名: a2.mp4
文件路径: a2.mp4
当前指令: ./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a2.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a2.jpg
文件名: a3.mp4
文件路径: a3.mp4
当前指令: ./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a3.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a3.jpg
文件名: a4.mp4
文件路径: a4.mp4
当前指令: ./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a4.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a4.jpg
文件名: images
文件路径: images
当前指令: ./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/images -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/images.jpg
执行的结果: "killed":false,"code":1,"signal":null,"cmd":"./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/images -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/images.jpg"
/Users/jalen/Desktop/inv/ffmpeg/vlist/images/images.jpg success...
执行的结果: "killed":false,"code":234,"signal":null,"cmd":"./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a4.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a4.jpg"
/Users/jalen/Desktop/inv/ffmpeg/vlist/images/a4.jpg success...
执行的结果: "killed":false,"code":234,"signal":null,"cmd":"./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a3.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a3.jpg"
/Users/jalen/Desktop/inv/ffmpeg/vlist/images/a3.jpg success...
执行的结果: "killed":false,"code":234,"signal":null,"cmd":"./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a2.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a2.jpg"
/Users/jalen/Desktop/inv/ffmpeg/vlist/images/a2.jpg success...
执行的结果: "killed":false,"code":234,"signal":null,"cmd":"./ffmpeg -ss 00:00:00 -t 00:00:01 -i /Users/jalen/Desktop/inv/ffmpeg/vlist/a1.mp4 -an -f image2 -s 640:1136 /Users/jalen/Desktop/inv/ffmpeg/vlist/images/a1.jpg"
/Users/jalen/Desktop/inv/ffmpeg/vlist/images/a1.jpg success...

完结撒花,欢迎老铁们点赞加关注呀~~~。

如何使用ffmpeg提取视频中的第一帧?

【中文标题】如何使用ffmpeg提取视频中的第一帧?【英文标题】:How to extract the very first frame of a second in a video using ffmpeg? 【发布时间】:2020-05-18 17:25:27 【问题描述】:

我正在尝试从视频中提取第一帧。我尝试了不同的方法来实现这一点,但我失败了。这里是我试过的命令。

ffmpeg -i input.ts -s 400x222 -q:v 3 -start_number 0 -vf fps=1 %d.jpg

稍后,我尝试使用特定秒的以下命令再次提取帧。这里我提取的是第 210 秒的帧。

ffmpeg -ss 210 -i input.ts -s 300x250 -t 1 -start_number 0 images.%d.jpg

我只想提取第二个的起始帧。假设从那一秒的 0.001 开始。

当我将我的第一个命令提取的 210 秒的帧与第二个命令提取的第一帧进行比较时,它们是完全不同的。

为了以后使用,为了防止冲突,我只想提取原始输入视频的第一帧。我尝试使用 *** 专家过去告诉过的命令here。但是当我运行它时。它只是提取起始帧(只有 1 帧)。

如何每秒提取视频的起始帧?

【问题讨论】:

你想要每秒的第一帧吗?意思是如果你的帧速率是 25 fps,那么你想要每秒 25 帧中的 1 帧,对吗? @Milan 是的。你完全明白了。 【参考方案1】:

试试这个命令:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 25)\, 0\, 0), setpts=N/24/TB" output-%04d.png

你必须在 between(mod(n\, 25)\, 0\, 0) 中传递你的视频帧率或 fps 我的视频 fps 是 25 所以我通过了 25

如果你的 fps 为 60,那么你必须在 between(mod(n\, 60)\, 0\, 0) 中传递 60

如果您想要每秒的前 5 帧,请使用 between(mod(n\, 25)\, 0\, 4),它会为您提供每秒的前 5 帧。

【讨论】:

对于 VFR 流不可靠。有关通用表达式,请参阅我的回答 here。 @Milan 我试过使用你的命令,但是当我在我的问题中重新运行第二个命令时(即在特定的那一秒再次提取帧),第 0 帧的帧不同。第一个和第二个命令生成的两个帧是不同的。 您还想从视频的特定秒中提取一帧,对吗? @MilanTejani 是的。我希望我的两个命令的第 0 帧应该相同。 @Gyan 有什么解决方案吗?

以上是关于3分钟提取10000个视频的第一帧图片,node执行ffmpeg万能脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何截取视频的第一帧图片

如何使用ffmpeg提取视频中的第一帧?

第五十二篇 OC获取视频的第一帧图片thumbnailImage

在Android中如何获取视频的第一帧图片并显示在一个ImageView中

如何把视频提取照片

如何在视频的第一帧之前放置静止图像?