{"version":3,"sources":["jsdelivr-header.js","/npm/mp4-remux@0.2.1/src/boxes.class/Mp4Box.class.ts","/npm/mp4-remux@0.2.1/src/boxes.class/trex.ts","/npm/mp4-remux@0.2.1/src/boxes.class/trun.ts","/npm/mp4-remux@0.2.1/src/boxes.class/tfdt.ts","/npm/mp4-remux@0.2.1/src/boxes.class/tfhd.ts","/npm/mp4-remux@0.2.1/src/boxes.class/traf.ts","/npm/mp4-remux@0.2.1/src/boxes.class/mfhd.ts","/npm/mp4-remux@0.2.1/src/boxes.class/udta.ts","/npm/mp4-remux@0.2.1/src/boxes.class/mdia.ts","/npm/mp4-remux@0.2.1/src/boxes.class/ftyp.ts","/npm/mp4-remux@0.2.1/src/boxes.class/free.ts","/npm/mp4-remux@0.2.1/src/boxes.class/moov.ts","/npm/mp4-remux@0.2.1/src/boxes.class/moof.ts","/npm/mp4-remux@0.2.1/src/boxes.class/sidx.ts","/npm/mp4-remux@0.2.1/src/boxes.class/mdat.ts","/npm/mp4-remux@0.2.1/src/boxes.class/mvhd.ts","/npm/mp4-remux@0.2.1/src/boxes.class/mvex.ts","/npm/mp4-remux@0.2.1/src/boxes.class/tkhd.ts","/npm/mp4-remux@0.2.1/src/boxes.class/trak.ts","/npm/mp4-remux@0.2.1/src/boxes.class/edts.ts","/npm/mp4-remux@0.2.1/src/Mp4Stream.class.ts","/npm/mp4-remux@0.2.1/src/index.ts"],"names":[],"mappings":"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","file":"/npm/mp4-remux@0.2.1/lib/mp4-remux.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/mp4-remux@0.2.1/lib/mp4-remux.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { Box } from \"./types\";\r\nimport * as Boxes from \".\";\r\n\r\nexport class Mp4Box {\r\n  stream: Uint8Array = new Uint8Array();\r\n  dv: DataView = new DataView(new Uint8Array().buffer);\r\n  boxs: Box[] = [];\r\n  boxPos = 0; // 记录元数据和盒子数据的偏差\r\n\r\n  constructor(buf: Uint8Array) {\r\n    this.stream = buf;\r\n    this.dv = new DataView(buf.buffer);\r\n  }\r\n\r\n  set size(value: number) {\r\n    this.writeUint(4, value);\r\n  }\r\n  get size() {\r\n    return this.readUint(4);\r\n  }\r\n  get type() {\r\n    return this.readString(4, 4);\r\n  }\r\n\r\n  /**\r\n   * 获取当前 box 的 binary\r\n   */\r\n  get raw() {\r\n    if (this.boxPos) {\r\n      let size = this.boxPos;\r\n      const bufs = this.boxs.map((item) => {\r\n        const boxRaw = item.raw;\r\n        size += boxRaw.length;\r\n        return boxRaw;\r\n      });\r\n      this.size = size;\r\n      const base = this.stream.slice(0, this.boxPos);\r\n\r\n      // 将 Uint8Array[] 合并成一个\r\n      const nbuf = new Uint8Array(size);\r\n      let pos = 0;\r\n      for (const item of [base, ...bufs]) {\r\n        nbuf.set(item, pos);\r\n        pos += item.length;\r\n      }\r\n      return nbuf;\r\n    }\r\n\r\n    return this.stream;\r\n  }\r\n  writeUint(size: 1 | 2 | 4, val: number, pos = 0) {\r\n    const view = this.dv;\r\n    switch (size) {\r\n      case 1:\r\n        view.setUint8(pos, val);\r\n        break;\r\n      case 2:\r\n        view.setUint16(pos, val);\r\n        break;\r\n      case 4:\r\n        view.setUint32(pos, val);\r\n        break;\r\n    }\r\n  }\r\n  writeInt(size: 1 | 2 | 4, val: number, pos = 0) {\r\n    const view = this.dv;\r\n    switch (size) {\r\n      case 1:\r\n        view.setInt8(pos, val);\r\n        break;\r\n      case 2:\r\n        view.setInt16(pos, val);\r\n        break;\r\n      case 4:\r\n        view.setInt32(pos, val);\r\n        break;\r\n    }\r\n  }\r\n\r\n  readInt(size: 1 | 2 | 4 = 4, pos = 0) {\r\n    const view = this.dv;\r\n    switch (size) {\r\n      case 1:\r\n        return view.getInt8(pos);\r\n      case 2:\r\n        return view.getInt16(pos);\r\n      case 4:\r\n        return view.getInt32(pos);\r\n    }\r\n  }\r\n\r\n  // use dataView to Get Unsigned Int\r\n  readUint(size: 1 | 2 | 4, pos = 0) {\r\n    const view = this.dv;\r\n    switch (size) {\r\n      case 1:\r\n        return view.getUint8(pos);\r\n      case 2:\r\n        return view.getUint16(pos);\r\n      case 4:\r\n        return view.getUint32(pos);\r\n    }\r\n  }\r\n  /**\r\n   * Read string by char code from Uint8Array\r\n   * @param size\r\n   */\r\n  readString(size: 4, pos = 0) {\r\n    let s = \"\";\r\n    for (let i = 0; i < size; i++) {\r\n      s += String.fromCharCode(this.readUint(1, pos + i));\r\n    }\r\n    return s;\r\n  }\r\n\r\n  parse(boxPos: number) {\r\n    this.boxPos = boxPos;\r\n    let pos = boxPos;\r\n    while (pos <= this.stream.length - 8) {\r\n      const size = this.readUint(4, pos);\r\n      const type = this.readString(4, 4 + pos);\r\n      if (size <= this.stream.length) {\r\n        const tBuf = this.stream.slice(pos, pos + size);\r\n\r\n        const BoxClass = Boxes[type as keyof typeof Boxes] || Boxes.free;\r\n        this.boxs.push(new BoxClass(tBuf));\r\n      }\r\n      pos += size;\r\n    }\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class trex extends Mp4Box {\r\n\r\n  get version() {\r\n    return this.readUint(1, 8);\r\n  }\r\n  get track_id():number{\r\n    return this.readUint(4,12);\r\n  }\r\n  set track_id(value){\r\n    this.writeUint(4,value,12);\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class trun extends Mp4Box {\r\n  get sample_count() {\r\n    return this.readUint(4, 12);\r\n  }\r\n  get data_offset() {\r\n    return this.readInt(4, 16);\r\n  }\r\n  set data_offset(val) {\r\n    this.writeInt(4, val, 16);\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class tfdt extends Mp4Box {}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class tfhd extends Mp4Box {\r\n  get version() {\r\n    return this.readUint(1, 8);\r\n  }\r\n  get track_id():number{\r\n    return this.readUint(4,12);\r\n  }\r\n  set track_id(value){\r\n    this.writeUint(4,value,12);\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\nimport { trun, tfhd } from \".\";\r\n\r\nexport class traf extends Mp4Box {\r\n  constructor(buf: Uint8Array) {\r\n    super(buf);\r\n    this.parse(8);\r\n  }\r\n  get tfhd() {\r\n    return this.boxs.find((box) => box instanceof tfhd) as tfhd;\r\n  }\r\n  get trun() {\r\n    return this.boxs.find((box) => box instanceof trun) as trun;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class mfhd extends Mp4Box {\r\n  get sequence_number() {\r\n    return this.readUint(4, 12);\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class udta extends Mp4Box {}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class mdia extends Mp4Box {}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class ftyp extends Mp4Box {}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class free extends Mp4Box {}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\nimport { mvhd, mvex, trak } from \".\";\r\n\r\nexport class moov extends Mp4Box {\r\n  constructor(buf: Uint8Array) {\r\n    super(buf);\r\n    this.parse(8);\r\n  }\r\n\r\n  get mvhd() {\r\n    return this.boxs.find((box) => box instanceof mvhd) as mvhd;\r\n  }\r\n  get mvex(){\r\n    return this.boxs.find((box) => box instanceof mvex) as mvex;\r\n  }\r\n  get trak(){\r\n    return this.boxs.find((box) => box instanceof trak) as trak;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\nimport { mfhd, traf } from \"./\";\r\n\r\nexport class moof extends Mp4Box {\r\n  constructor(buf: Uint8Array) {\r\n    super(buf);\r\n    this.parse(8);\r\n  }\r\n  get mfhd(){\r\n    return this.boxs.find((box) => box instanceof mfhd) as mfhd\r\n  }\r\n  get traf(){\r\n    return this.boxs.find((box) => box instanceof traf) as traf\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class sidx extends Mp4Box {\r\n  get version() {\r\n    return this.readUint(1, 8);\r\n  }\r\n  get reference_ID() {\r\n    return this.readUint(4, 12);\r\n  }\r\n  get timescale() {\r\n    return this.readUint(4, 16);\r\n  }\r\n  get reserved() {\r\n    let offset = 8 + 20;\r\n    if (this.version !== 0) {\r\n      offset = 16 + 20;\r\n    }\r\n    return this.readUint(2, offset);\r\n  }\r\n  get reference_count() {\r\n    let offset = 8 + 20;\r\n    if (this.version !== 0) {\r\n      offset = 16 + 20;\r\n    }\r\n    offset += 2;\r\n    return this.readUint(2, offset);\r\n  }\r\n  get refList() {\r\n    let offset = 8 + 24;\r\n    if (this.version !== 0) {\r\n      offset = 16 + 24;\r\n    }\r\n    const refrenceCount = this.reference_count;\r\n    const resList = [];\r\n    for (let i = 0; i < refrenceCount; i++) {\r\n      const pos = offset + i * 12; // Position\r\n      let tmp_32 = this.readUint(4, pos);\r\n      const reference_type = (tmp_32 >> 31) & 0x1;\r\n      const referenced_size = tmp_32 & 0x7fffffff;\r\n      const subsegment_duration = this.readUint(4, pos + 4);\r\n      tmp_32 = this.readUint(4, pos + 8);\r\n      const starts_with_SAP = (tmp_32 >> 31) & 0x1;\r\n      const SAP_type = (tmp_32 >> 28) & 0x7;\r\n      const SAP_delta_time = tmp_32 & 0xfffffff;\r\n      resList.push({\r\n        reference_type,\r\n        referenced_size,\r\n        subsegment_duration,\r\n        starts_with_SAP,\r\n        SAP_type,\r\n        SAP_delta_time,\r\n      });\r\n    }\r\n    return resList;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class mdat extends Mp4Box {\r\n  push(value: Uint8Array) {\r\n    // 向 stream 追加数据\r\n\r\n    const newBuf = new Uint8Array(this.stream.length + value.length);\r\n    newBuf.set(this.stream);\r\n    newBuf.set(value, this.stream.length);\r\n    this.stream = newBuf;\r\n    this.dv = new DataView(this.stream.buffer);\r\n    this.size = newBuf.length;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class mvhd extends Mp4Box {\r\n\r\n  get version() {\r\n    return this.readUint(1, 8);\r\n  }\r\n\r\n  get next_track_ID(){\r\n    if(this.version === 0){\r\n      return this.readUint(4,104);\r\n    }else{\r\n      return this.readUint(4,116);\r\n    }\r\n  }\r\n  set next_track_ID(value){\r\n    if(this.version === 0){\r\n      this.writeUint(4,value,104);\r\n    }else{\r\n      this.writeUint(4,value,116);\r\n    }\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\nimport { trex } from \"./\";\r\n\r\nexport class mvex extends Mp4Box {\r\n  constructor(buf: Uint8Array) {\r\n    super(buf);\r\n    this.parse(8);\r\n\r\n\r\n  }\r\n  get trex(){\r\n    return this.boxs.find((box) => box instanceof trex) as trex;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class tkhd extends Mp4Box {\r\n  get version() {\r\n    return this.readUint(1, 8);\r\n  }\r\n\r\n  get track_id():number{\r\n    if(this.version === 1){\r\n      return this.readUint(4, 28);\r\n    }else{\r\n      return this.readUint(4,20);\r\n    }\r\n  }\r\n  set track_id(value){\r\n    if(this.version === 1){\r\n      this.writeUint(4,value,28);\r\n    }else{\r\n      this.writeUint(4,value,20);\r\n    }\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\nimport { tkhd } from \"./tkhd\";\r\n\r\nexport class trak extends Mp4Box {\r\n  constructor(buf: Uint8Array) {\r\n    super(buf);\r\n    this.parse(8);\r\n  }\r\n  get tkhd(): tkhd {\r\n    return this.boxs.find((box) => box instanceof tkhd) as tkhd;\r\n  }\r\n}\r\n","import { Mp4Box } from \"./Mp4Box.class\";\r\n\r\nexport class edts extends Mp4Box {}\r\n","import * as Boxes from \"./boxes.class\";\r\nimport { Box } from \"./boxes.class/types\";\r\n\r\nexport class Mp4Stream {\r\n  stream: Uint8Array = new Uint8Array();\r\n  dv: DataView = new DataView(new Uint8Array().buffer);\r\n  boxs: Box[] = [];\r\n  isEnd = false;\r\n\r\n  get sidx() {\r\n    return this.boxs.find((box) => box instanceof Boxes.sidx) as Boxes.sidx;\r\n  }\r\n  get moov() {\r\n    return this.boxs.find((box) => box instanceof Boxes.moov) as Boxes.moov;\r\n  }\r\n\r\n  push(value: Uint8Array) {\r\n    const newBuf = new Uint8Array(this.stream.length + value.length);\r\n    newBuf.set(this.stream);\r\n    newBuf.set(value, this.stream.length);\r\n    this.stream = newBuf;\r\n    this.dv = new DataView(this.stream.buffer);\r\n  }\r\n\r\n  /**\r\n   * 将stream 截断，把pos前的数据返回，然后更新dataView\r\n   * @param pos\r\n   */\r\n  slice(pos: number) {\r\n    const sliceBuf = this.stream.slice(0, pos);\r\n    const newBuf = new Uint8Array(this.stream.length - pos);\r\n    newBuf.set(this.stream.slice(pos));\r\n    this.stream = newBuf;\r\n    this.dv = new DataView(this.stream.buffer);\r\n    return sliceBuf;\r\n  }\r\n  // use dataView to Get Unsigned Int\r\n  readUint(size: 1 | 2 | 4, pos = 0) {\r\n    const view = this.dv;\r\n    switch (size) {\r\n      case 1:\r\n        return view.getUint8(pos);\r\n      case 2:\r\n        return view.getUint16(pos);\r\n      case 4:\r\n        return view.getUint32(pos);\r\n    }\r\n  }\r\n  /**\r\n   * Read string by char code from Uint8Array\r\n   * @param size\r\n   */\r\n  readString(size: 4, pos = 0) {\r\n    let s = \"\";\r\n    for (let i = 0; i < size; i++) {\r\n      s += String.fromCharCode(this.readUint(1, pos + i));\r\n    }\r\n    return s;\r\n  }\r\n  parse() {\r\n    // 检查this.stream 的长度是否足够 2*4*8\r\n    if (this.stream.length < 8) {\r\n      return; // Not Enough\r\n    }\r\n\r\n    const size = this.readUint(4);\r\n    const type = this.readString(4, 4);\r\n\r\n    if (size <= this.stream.length) {\r\n      const tBuf = this.slice(size);\r\n\r\n      const BoxClass = Boxes[type as keyof typeof Boxes] || Boxes.free;\r\n      this.boxs.push(new BoxClass(tBuf));\r\n\r\n      this.parse(); // 继续向后解析\r\n    }\r\n  }\r\n\r\n  end() {\r\n    this.isEnd = true;\r\n  }\r\n}\r\n","import { Mp4Stream } from \"./Mp4Stream.class\";\r\nimport * as Boxes from \"./boxes.class\";\r\n\r\nexport default function remux(vs: ReadableStream, as: ReadableStream) {\r\n  //  读取两个stream的数据\r\n  const videoReader = vs.getReader();\r\n  const audioReader = as.getReader();\r\n\r\n  const videoStream = new Mp4Stream();\r\n  const audioStream = new Mp4Stream();\r\n\r\n  const { readable, writable } = new TransformStream();\r\n  const writer = writable.getWriter();\r\n\r\n  let status = -1;\r\n\r\n  function callWrite(buf: Uint8Array) {\r\n    writer.write(buf);\r\n  }\r\n\r\n  async function checkStream() {\r\n    if (status === -1) {\r\n      // 合并 moov 中的 track 信息\r\n      const videoMoov = videoStream.moov;\r\n      const audioMoov = audioStream.moov;\r\n      if (videoMoov && audioMoov) {\r\n\r\n        const videoMvex = videoMoov.mvex;\r\n        const audioMvex = audioMoov.mvex;\r\n        if (videoMvex && audioMvex) {\r\n          const videoTrex = videoMvex.trex;\r\n          const audioTrex = audioMvex.trex;\r\n\r\n          videoTrex.track_id = 1;\r\n          audioTrex.track_id = 2;\r\n\r\n          // console.log(videoMvex, audioMvex);\r\n          videoMvex.boxs = videoMvex.boxs.filter(item=>!(item instanceof Boxes.trex));\r\n          videoTrex && videoMvex.boxs.push(videoTrex);\r\n          audioTrex && videoMvex.boxs.push(audioTrex);\r\n        }\r\n\r\n        const videoTrak = videoMoov.trak;\r\n        const audioTrak = audioMoov.trak;\r\n        if (videoTrak && audioTrak) {\r\n          videoTrak.tkhd.track_id = 1;\r\n          audioTrak.tkhd.track_id = 2;\r\n\r\n          videoMoov.boxs.push(audioTrak);\r\n          for (const item of videoStream.boxs) {\r\n            callWrite(item.raw);\r\n            if (item === videoMoov) {\r\n              break;\r\n            }\r\n          }\r\n          status = 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // 需要先有 sidx\r\n    if (!videoStream.sidx || !audioStream.sidx) {\r\n      return;\r\n    }\r\n\r\n    if (status !== -1) {\r\n      const videoMaxIndex = videoStream.sidx.reference_count;\r\n      const audioMaxIndex = audioStream.sidx.reference_count;\r\n      if (status <= videoMaxIndex && status <= audioMaxIndex) {\r\n        // 合并\r\n\r\n        // Step1 获取需要的分片数据\r\n        const videoMoof = videoStream.boxs.find((item) => {\r\n          return (\r\n            item instanceof Boxes.moof && item?.mfhd.sequence_number === status\r\n          );\r\n        }) as Boxes.moof;\r\n        const audioMoof = audioStream.boxs.find((item) => {\r\n          return (\r\n            item instanceof Boxes.moof && item?.mfhd.sequence_number === status\r\n          );\r\n        }) as Boxes.moof;\r\n        const videoData = videoMoof && (videoStream.boxs[videoStream.boxs.indexOf(videoMoof) + 1] as Boxes.mdat);\r\n        const audioData = audioMoof && (audioStream.boxs[audioStream.boxs.indexOf(audioMoof) + 1] as Boxes.mdat);\r\n\r\n        if (videoMoof && videoData && audioMoof && audioData) {\r\n          // 处理合并流程\r\n          const videoTraf = videoMoof.traf;\r\n          const audioTraf = audioMoof.traf;\r\n\r\n          videoTraf.tfhd.track_id = 1;\r\n          audioTraf.tfhd.track_id = 2;\r\n          if (videoTraf?.trun && audioTraf?.trun) {\r\n            const audioTrafSize = audioTraf.size;\r\n            const videoMoofSize = videoMoof.size;\r\n            const videoDataSize = videoData.size;\r\n            videoTraf.trun.data_offset = videoMoofSize + audioTrafSize + 8;\r\n            audioTraf.trun.data_offset = videoMoofSize + audioTrafSize + videoDataSize;\r\n\r\n            videoMoof.boxs.push(audioTraf);\r\n\r\n            callWrite(videoMoof.raw);\r\n\r\n            // 处理 mdat 合并\r\n            videoData.push(audioData.raw.slice(8));\r\n            callWrite(videoData.raw);\r\n\r\n            // 释放存储空间\r\n            videoStream.boxs = videoStream.boxs.filter((item) => item !== videoMoof);\r\n            videoStream.boxs = videoStream.boxs.filter((item) => item !== videoData);\r\n            audioStream.boxs = audioStream.boxs.filter((item) => item !== audioMoof);\r\n            audioStream.boxs = audioStream.boxs.filter((item) => item !== audioData);\r\n\r\n            status += 1;\r\n            checkStream();\r\n          }\r\n        }\r\n      } else if (status > videoMaxIndex && status <= audioMaxIndex) {\r\n        // 追加 audio\r\n        const audioMoof = audioStream.boxs.find((item) => {\r\n          return (\r\n            item instanceof Boxes.moof && item?.mfhd.sequence_number === status\r\n          );\r\n        }) as Boxes.moof;\r\n        audioMoof.traf.tfhd.track_id = 2;\r\n        const audioData = audioMoof && (audioStream.boxs[audioStream.boxs.indexOf(audioMoof) + 1] as Boxes.mdat);\r\n        if (audioMoof && audioData) {\r\n          callWrite(audioMoof.raw);\r\n          callWrite(audioData.raw);\r\n          status += 1;\r\n          checkStream();\r\n        }\r\n      } else if (status > audioMaxIndex && status <= videoMaxIndex) {\r\n        // 追加 Video\r\n        const videoMoof = videoStream.boxs.find((item) => {\r\n          return (\r\n            item instanceof Boxes.moof && item?.mfhd.sequence_number === status\r\n          );\r\n        }) as Boxes.moof;\r\n        videoMoof.traf.tfhd.track_id = 1;\r\n        const videoData = videoMoof && (videoStream.boxs[videoStream.boxs.indexOf(videoMoof) + 1] as Boxes.mdat);\r\n        if (videoMoof && videoData) {\r\n          callWrite(videoMoof.raw);\r\n          callWrite(videoData.raw);\r\n          status += 1;\r\n          checkStream();\r\n        }\r\n      } else if (status > videoMaxIndex && status > audioMaxIndex) {\r\n        // end\r\n        status = -2;\r\n        // console.log(\"call close\", status, videoMaxIndex, audioMaxIndex);\r\n        // writer.releaseLock();\r\n        writer.close();\r\n      }\r\n    }\r\n  }\r\n\r\n  // 并行读取两个reader的数据\r\n  async function readerHandler(streamReader: ReadableStreamDefaultReader<any>, mp4Stream: Mp4Stream) {\r\n    while (true) {\r\n      const { done, value } = await streamReader.read();\r\n      if (value) {\r\n        mp4Stream.push(value);\r\n        mp4Stream.parse();\r\n\r\n        checkStream();\r\n      }\r\n      // 将value拼接到 chunk后\r\n\r\n      if (done) {\r\n        mp4Stream.end();\r\n        checkStream();\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  readerHandler(videoReader, videoStream);\r\n  readerHandler(audioReader, audioStream);\r\n  return readable;\r\n}\r\n"]}