实现m3u8视频源的下载和合并。
支持aes-128-cbc简单加密的ts文件自动解密下载和手动配置加密方法,key,iv;
支持文件缓存,断点续传。
方便对接电影资源站,进行批量下载。
npm install m3u8utils
let m3u8Utils = require('m3u8utils');
参数:
url string
返回:
segments 所有.ts文件描述数组
newM3u8Data:'',//新的m3u8文件
oldM3u8Data:data.body//旧的m3u8文件
例子:
let m3u8Utils = require('m3u8utils');
m3u8Utils.parseM3u8('https://v4.cdtlas.com/20211113/20urU8bN/index.m3u8').then((data)=>{
console.log(data);
})
参数:
url string m3u8网络地址
pathTarget string 下载存储目录,调用结束后目录文件夹下会生成input.txt(用于ts文件合并),相对路径的index.m3u8
progress function 下载过程中处理下载数据
例子:
let m3u8Utils = require('m3u8utils');
let log = require('single-line-log').stdout;
let downloadNum = 0;
m3u8Utils.downloadM3u8('https://v4.cdtlas.com/20211113/20urU8bN/index.m3u8', 'D:\\m3u81',
function (mediaData, // 当前Ts的Buffer
TsInfo, //当前Ts文件相关信息
pathTarget, //文件要存放目录
segmentOrder, //当前Ts文件在Segments数组中的位置-1
segments, //Segments列表(描述Ts文件信息的列表)
TsInfoKeyMethod, //加密方法 例如aes-128,ts文件没有加密为值undefined
cryptoKey, //加密对应的key值,ts文件没有加密为值undefined
cryptoIv //加密偏移量iv,ts文件没有加密为值undefined
) {
downloadNum++;
var str_next = '░', str_over ='█' ,total = 80;
var str_over_length = parseInt(downloadNum / segments.length * 80);
log((downloadNum / segments.length * 100).toFixed(2)+'%' + str_over.repeat(str_over_length) + str_next.repeat(80 - str_over_length) + downloadNum + '/' + segments.length);
return mediaData;//返回处理后的数据
// return { //返回
// data:mediaData,
// cryptoMethod:'aes-128-cbc',
// cryptoKey:'key',
// cryptoIv:'iv',
// isDecrypto:false //默认未解密
// }
})
使用ffmpeg将ts片段合并成.mp4文件
参数:
inputFilePath 存放所有ts文件位置的input.txt文件或者文件夹
targetFilePath 合并后的mp4要存放到的完整路径
let m3u8Utils = require('m3u8utils');
m3u8Utils.m3u8Convert('D:\\m3u81\\input.txt','d:\\m3u81/ss1.mp4').then(destPath=>{
console.log(destPath)
});
let m3u8Utils = require('m3u8utils')
let log = require('single-line-log').stdout;
let downloadNum = 0;
m3u8Utils.downloadM3u8('https://v4.cdtlas.com/20211113/20urU8bN/index.m3u8', 'D:\\m3u82', function (mediaData, TsInfo, pathTarget, segmentsOrder, parseM3u8RstSegmentsOrg, TsInfoKeyMethod, cryptoKey, cryptoIv) {
downloadNum++;
var str_next = '░', str_over = '█', total = 80;
var str_over_length = parseInt(downloadNum / parseM3u8RstSegmentsOrg.length * 80);
log((downloadNum / parseM3u8RstSegmentsOrg.length * 100).toFixed(2) + '% ' + str_over.repeat(str_over_length) + str_next.repeat(total - str_over_length) + ' ' + downloadNum + '/' + parseM3u8RstSegmentsOrg.length);
if (downloadNum === parseM3u8RstSegmentsOrg.length) { //下载完成进行ts文件合并
console.log('开始合并,请稍等')
m3u8Utils.m3u8Convert(pathTarget, pathTarget + '/ss1.mp4').then(destPath => {
console.log(destPath,'合并结束');
});
};
return mediaData;
})