用 Stream 合并多个视频文件
本节承上文ts视频文件合并,你也可尝试合并其他同类型文件
分析
- 用Nodejs的读写流以及管道方法
- 需要注意的是可读流的end可选参数默认为True,读取器终止时默认终止写入器
多合一,显然读多写一,因此需要关注可读对象配置为false,防止前可读对象写入完成后,该可写对象终止,从而产生后续可读对象无法写入的情况 - 使用递归,可读流的end事件,前者结束时后者开始
上码
// 合并流文件
const fs = require("fs")
// 创建写入流
var merge = fs.createWriteStream("big.ts")
var i = 1;
var arr = [];
// 该值从m3u8文件中得知
var end = 140;
while (i <= end) {
var tsread = ("00000" + i).substr(-5)
arr.push(tsread + '.ts')
i++
}
// console.log(arr);
// 此法不可取,会发生可写流争用merge流对象,多片则易出现内存泄露风险
// for (var i = 0; i < 7; i++) {
// fs.createReadStream("tsfile/" + arr[i]).pipe(merge, { end: false })
// }
// 递归确保调用链有序
function mgStream(arr, dst) {
if (!arr.length) {
dst.end("合并完成")
return
}
var curfile = "tsfile/" + arr.shift()
stream = fs.createReadStream(curfile)
// 默认配置值为true,此时读取器终止时默认终止写入器(可写流),故需要为false
stream.pipe(merge, { end: false })
// 在当前可读流完毕时,执行递归
stream.on("end", function () {
console.log("完成 " + curfile + " 文件合并")
mgStream(arr, merge)
})
}
mgStream(arr, merge)
效果
D:\code-base\js\m3u8ts>node "d:\code-base\js\m3u8ts\tsmerge.js"
完成 tsfile/00001.ts 文件合并
完成 tsfile/00002.ts 文件合并
完成 tsfile/00003.ts 文件合并
...
本作品采用《CC 协议》,转载必须注明作者和本文链接