nodejs用 fluent ffmpeg组件对视频进行分片和加密

发布于 2019-08-25  2.73k 次阅读


安装组件 npm install fluent-ffmpeg

导入组件 const ffmpegCommand = require('fluent-ffmpeg')

对视频进行切片

//对视频分片加密
ffmpegCommand(fileName) 
    .addOption('-hls_time', '10')   //设置每个片段的长度
    .addOption('-hls_key_info_file', keyInfoPath) //keyInfoPath为密匙
    .addOption('-hls_list_size', '0')
    .addOption('-threads', '4')
    .save(playList)    //playList为保存m3u8索引文件的地址,例如xxx/playlist.m3u8
    .on('end', () => {   //分片结束时回调
        console.log('分片加密完成');
    })
    .on('stderr', function (stderrLine) { //在分片加密时的回调
        logger.debug('Stderr output: ' + stderrLine);
    })
    .on('error', function (err) {        //发生错误的回调
  
    });

//获取视频的长度 
ffmpegCommand.ffprobe(fileName, async function (e, d) {
  //返回的函数d是个对象,里面有steam属性,steam属性是个数组
  //这里罗列几个比较重要的值,其他的值可以自己去github官方文档上看
  steam[0].codec_name //编码格式
  steam[0].duration   //视频的时长,单位为秒
  steam[0].width      //视频宽度
  steam[0].height   //视频高度
});

    //生成视频缩略图,对视频里面的每一秒进行截图
    ffmpegCommand(fileName)
            .on('filenames', function (filenames) {
               //filenames为截图保存的图片名,格式在保存的时候定义
                console.log('Will generate ' + filenames.join(', '))
            })
            .on('end', function () {
            })
            .screenshots({
                //生成多少张图 
                count: 4,   
               //在指定时间位置生成图片,我这里指定的是在1秒2秒3秒的位置截3张图
                timemarks:[1,2,3]  //参数是个数组
                //图片保存位置                                                                                             
                folder: 'save path for folder',            
                //保存图片的名字格式 imgname_1
                filename: '%b_%i',                                   
                size: `${width}x${height}`
            });

顺带一提,count属性和timemarks属性两者选一个即可,count是截取多少张图,这个截取是根据视频来的,上面的参数为4,则在视频20%的地方截取一张图,40%的地方截取一张图,百分之60的地方截取一张图,80%的地方截取一张图

timemarks则是指定时间,如timestamps: [30.5, '50%', '01:10.123'], 如果同时存在两个属性,timemarks优先级大于count

关于filename则是图片保存的名字格式,格式为:
'%s':以秒为单位的偏移量
'%w':截图宽度
'%h':截图高度
'%r':屏幕截图分辨率(与'%wx%h'相同)即宽乘以高
'%f':输入文件名
'%b':输入basename(文件名没有扩展名)
'%i':时间标记数组中的屏幕截图索引(可以像使用它一样进行零填充
%000i)

最后提一下,获取文件缩略图的操作貌似是异步的,之前跑过发现是异步的操作,如果需要先获取视频长度在根据视频的毫秒数来决定生成多少张缩略图,个人建议对生成缩略图的操作封装成promise对象,用await调用对象,或者把方法写到ffmpegCommand.ffprobe回调函数内即可

github官方文档地址:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg

分片前提是进行分片的文件一定是h264视频编码格式和音频编码为aac格式的,否则加密完了会出现播放不出来视频或者其他的一些问题


一个逐渐被时间遗忘掉的人