美文网首页
nodeJs批量抽取视频某一帧保存为图片

nodeJs批量抽取视频某一帧保存为图片

作者: 芸芸众生ing | 来源:发表于2020-07-16 12:50 被阅读0次

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
}

相关文章

网友评论

      本文标题:nodeJs批量抽取视频某一帧保存为图片

      本文链接:https://www.haomeiwen.com/subject/ibdphktx.html