用 Stream 合并多个视频文件

本节承上文ts视频文件合并,你也可尝试合并其他同类型文件

分析

  1. 用Nodejs的读写流以及管道方法
  2. 需要注意的是可读流的end可选参数默认为True,读取器终止时默认终止写入器
    多合一,显然读多写一,因此需要关注可读对象配置为false,防止前可读对象写入完成后,该可写对象终止,从而产生后续可读对象无法写入的情况
  3. 使用递归,可读流的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 文件合并
...

![](https://cdn.learnku.com/uploads/images/202004/23/18357/OGOXL7hS2p.png!large)

本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
133
粉丝
24
喜欢
101
收藏
56
排名:105
访问:8.9 万
私信
所有博文
社区赞助商