node制作一個(gè)視頻幀長(zhǎng)圖生成器操作分享
前言
平時(shí)我們?cè)诎l(fā)布視頻的時(shí)候通常都需要從視頻中截取一幀圖片作為視頻的封面,而現(xiàn)在常見的封面動(dòng)態(tài)預(yù)覽效果則可以通過(guò)視頻幀長(zhǎng)圖來(lái)輔助實(shí)現(xiàn),今天就讓我們一起使用node來(lái)制作一個(gè)視頻幀長(zhǎng)圖生成工具。
效果展示

如上圖,這是從一個(gè)3分鐘左右的視頻中截取出來(lái)的30幀截圖合成的長(zhǎng)圖。
工具實(shí)現(xiàn)
獲取視頻時(shí)長(zhǎng)
- 1、引入依賴 我們可以使用
get-video-duration這個(gè)庫(kù)中的getVideoDurationInSeconds這個(gè)方法來(lái)獲取視頻的時(shí)長(zhǎng)。
const { getVideoDurationInSeconds } = require('get-video-duration');- 2、獲取時(shí)長(zhǎng)
getVideoDurationInSeconds是一個(gè)異步獲取圖片時(shí)長(zhǎng)的方法,入?yún)樾枰@取時(shí)長(zhǎng)的視頻路徑,返回的結(jié)果為視頻的時(shí)長(zhǎng)秒數(shù)。
getVideoDurationInSeconds(videoPath);
控制臺(tái)交互獲取相關(guān)參數(shù)

如上圖,我們可以在控制臺(tái)選擇相關(guān)的參數(shù),這里需要的參數(shù)主要有2個(gè),分別是視頻路徑和截取圖片數(shù)量。
這里使用了我自己基于inquirer封裝的一個(gè)控制臺(tái)文件選擇器插件,具體實(shí)現(xiàn)過(guò)程和使用方法可以查看我的這一篇文章:node封裝一個(gè)控制臺(tái)進(jìn)度條插件詳情
計(jì)算截取圖片的時(shí)間點(diǎn)集合
根據(jù)獲取到的時(shí)長(zhǎng)和輸入的截圖數(shù)量,我們可以計(jì)算出截取圖片的時(shí)間點(diǎn)集合。
const changTimeFormat = (seconds)=>{
seconds = parseInt(seconds);
let h = Math.floor(seconds / 3600);
h = h > 9 ? h : '0' + h;
seconds %= 3600;
let m = Math.floor(seconds / 60);
m = m > 9 ? m : '0' + m;
seconds %= 60;
seconds = seconds > 9 ? seconds : '0' + seconds;
return h + ':' + m + ':' + seconds;
};
const countSplitPoint = (duration,cutNums = 30) => {
cutNums = Math.min(cutNums,parseInt(duration));
const step = Math.floor(duration / cutNums);
let start = 0;
const res = [];
while(cutNums--){
res.push(changTimeFormat(start));
start += step;
}
return res;
};獲取每一個(gè)時(shí)間點(diǎn)的視頻幀截圖
1、引入依賴
const cp = require('child_process');
const ffmpeg = require('ffmpeg');引入child_process后,我們可以在node中執(zhí)行shell腳本語(yǔ)句。ffmpeg為比較常用的視頻處理工具庫(kù)。
2、功能實(shí)現(xiàn)
遞歸截取視頻各個(gè)時(shí)間點(diǎn)的截圖幀。
const execJpg = async(videoPath , saveFilePath, timeArr, index, cb )=>{
let ind = (index + 1) + '';
while(ind.length < (timeArr.length + '').length){
ind = '0' + ind;
}
const str = `ffmpeg -ss ${timeArr[index]} -i ${videoPath} -y -f image2 -t 0.001 ${saveFilePath + '\\' + ind}.jpg`;
await cp.exec(str,async(err)=>{
if(err) console.log(err);
const progressBar = new ProgressBar({
duration: timeArr.length - 1,
tip:{
0:'圖片截取中……',
100:'圖片截取完成!'
}
});
progressBar.run(index);
if(index < timeArr.length - 1){
await execJpg(videoPath , saveFilePath, timeArr, index + 1, cb )
}else{
console.log('開始合并圖片')
cb();
}
})
};
const getVideoFrame = (config,cb)=>{
getVideoDurationInSeconds(config.videoPath).then(async(res)=>{
const timeArr = countSplitPoint(res,config.cutNums);
await execJpg(config.videoPath , config.saveFilePath, timeArr, 0, cb );
});
};圖片拼接長(zhǎng)圖
這里使用了我前面封裝的一個(gè)圖片拼接庫(kù)來(lái)進(jìn)行處理,該庫(kù)的實(shí)現(xiàn)過(guò)程及使用方法可以查看我的這一篇文章:node實(shí)現(xiàn)封裝一個(gè)圖片拼接插件
let jInquirer = new JInquirer(config);
jInquirer.prompt().then(async(res)=>{
res.saveFilePath = '.\\img';
const ImgConcatClass = new ImgConcat();
getVideoFrame(res,()=>{
const p = {
folderPath:'.\\img', //資源目錄
targetFolder:'.\\longImg', //合并后圖片存放目錄
direction:'y' //拼接方向,y為橫向,n為縱向
}
ImgConcatClass.concatAll(p).then(ans=>{
console.log(ans);
return ans;
});
});
}); 到此這篇關(guān)于node制作一個(gè)視頻幀長(zhǎng)圖生成器操作分享的文章就介紹到這了,更多相關(guān)node制作生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js使用Streams來(lái)處理文件讀寫操作的示例代碼
在Node.js中,Streams 提供了一種高效的方式來(lái)處理文件的讀寫操作,特別是對(duì)于大文件或數(shù)據(jù)流,Streams 允許你以流的方式讀寫數(shù)據(jù),這意味著數(shù)據(jù)可以分塊處理,本文介紹了在Node.js中如何使用Streams來(lái)處理文件讀寫操作,需要的朋友可以參考下2024-09-09
Nginx設(shè)置為Node.js的前端服務(wù)器方法總結(jié)
在本篇文章中小編給大家分享了關(guān)于Nginx設(shè)置為Node.js的前端服務(wù)器的方法和實(shí)例,需要的朋友們學(xué)習(xí)下。2019-03-03
node.js對(duì)于數(shù)據(jù)庫(kù)MySQL基本操作實(shí)例總結(jié)【增刪改查】
這篇文章主要介紹了node.js對(duì)于數(shù)據(jù)庫(kù)MySQL基本操作,結(jié)合實(shí)例形式總結(jié)分析了node.js針對(duì)mysql數(shù)據(jù)庫(kù)基本配置、連接與增刪改查相關(guān)操作技巧,需要的朋友可以參考下2023-04-04
Linux 安裝nodejs環(huán)境及路徑配置詳細(xì)步驟
大家都知道linux安裝nodejs有兩種比較常用的方法,一種解壓即可用的方法操作比較簡(jiǎn)便,另一種方法通過(guò)編譯來(lái)安裝,本文重點(diǎn)給大家講解第一種方法,感興趣的朋友跟隨小編一起看看吧2021-11-11
ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解
這篇文章主要為大家介紹了ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Windows7系統(tǒng)下如何安裝nodejs16以上版本
這篇文章主要給大家介紹了關(guān)于Windows7系統(tǒng)下如何安裝nodejs16以上版本的相關(guān)資料,很多時(shí)候node.js的版本存在兼容,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
使用Node.js搭建Vue項(xiàng)目的詳細(xì)步驟
Vue.js 是一款流行的 JavaScript 框架,而 Node.js 提供了一個(gè)強(qiáng)大的運(yùn)行環(huán)境,兩者的結(jié)合使得開發(fā)者可以輕松構(gòu)建現(xiàn)代化的前端項(xiàng)目,本文將介紹如何使用 Node.js 搭建一個(gè)基本的 Vue 項(xiàng)目,需要的朋友可以參考下2023-12-12

