const fs = require('fs');
const PATH = require('path');
const { exec } = require('child_process');
let rootPath = E:\\dev
;
var saveDir = 'image';
let arr = [];
let obj = querydir(rootPath);
var classId = null;
function layer(b) {
b.forEach(e => {
if (e.child && e.child.length) {
layer(e.child)
} else if (!e.child) {
arr.push(e)
}
})
}
layer(obj);
let str = JSON.stringify(arr, "", "\t");
write('./data.json', str)
/**
递归查询目录
-
@param {Path} path 查询开始目录地址
/
function querydir(path) {
let list = fs.readdirSync(path);
list = list.sort((a, b) => {
a = a.match(/\d/)[0];
b = b.match(/\d*/)[0];
return a - b
})
if (list && list.length > 0) {
return list.map(name => {
let dir = path + '/' + name;
let isFile = fs.statSync(dir);
if (isFile && isFile.isDirectory()) {
if (name.match(/\(\d+\)/)) {
classId = name.match(/\(\d+\)/)[0]
}
return { class: name, name, child: querydir(dir, name) };
} else {let FilePath = dir.replace(rootPath, ''); FilePath = FilePath.replace(/[()]/g, ''); FilePath = FilePath.replace(/^.+\//, ''); let category_id = classId.replace(/[()]/g, '') * 1; name = name.replace(/[\d,\.\s\-mp4]/g, ''); intercept(dir, `./${saveDir}/${category_id}/` + name + '.jpg') return { popularity: 1, category_id, name, teacher_id: ['', 16, 17, 17, 16][category_id], video: 'videos/' + category_id + '/' + FilePath, cover: "images/" + category_id + "/" + name + ".jpg", } } })
}
}
/**
- 视频截图
- @param {Path} path 视频源地址路径
- @param {PathName} name 截图保存地址和文件名
- @param {Time} start 截取开始时间 秒
- @param {Time} end 截取结束时间 秒
/
function intercept(path, pathName, start = 7, end = 0.001) {
PathName = PATH.normalize(__dirname + pathName);
PathName = /\s/g.test(PathName) ? '"' + PathName + '"' : PathName;
path = /\s/g.test(path) ? '"' + path + '"' : path;
if (createDir('.' + pathName))
// ffmpeg -i [视频路径] -r 1 -q:v 2 -f image2 image-%d.jpeg
// 视频路径:如 "myvideo.mp4"(这时这个视频也在bin文件目录下才可以直接这么写),或者完整路径的
// -r:每秒提取的帧数,如上面为每秒1帧,即一张图像
// -q:v :图片质量
// -f:图片格式,上述为image2
// image-%d.jpeg:生成图像的文件名,可以加上完整路径,%d会使文件名按整数编号,如上述生成图像为image-1.jpeg, image-2.jpeg, ...
// 还有其他参数:
// -t:持续时间,如-t 4表示持续4s
// -ss:起始时间,如-ss 01:30:14,从01:30:14开始
// -vframes:指定抽取的帧数,如-vframes 120,指定抽取120张
// -s:格式大小,如-s 640x360
// -y:覆盖,直接使用
exec("ffmpeg -ss " + start + " -i " + path + " -y -f image2 -t " + end + ' ' + PathName + "", function (err, buffer) {
if (err) {
console.log('读取错误:', err);
}
});
}
/* - 写数据
- @param {Path} path 写入文件的路径
- @param {Buffer} buffer 被写入的数据
/
function write(path, buffer) {
fs.writeFile(path, buffer, function (err) {
if (err) { console.log('文件写入错误', err) }
})
}
/* - 创建多层级目录
- @param {Path} path 目录最终地址
*/
function createDir(path) {
// console.log(path);
if (!path) return false;
path = path.replace(//[\w_.?=\w\d]+$/, '');
let pathArr = PATH.normalize(path).split('\');
let a = '';
pathArr.forEach(e => {
a += e;
if (!fs.existsSync(a)) {
fs.mkdirSync(a)
}
a += '\';
})
return true
}