mp4-muxer-BBZkcVvS.js 30 KB

12345
  1. var ze=(e,t,s)=>{if(!t.has(e))throw TypeError("Cannot "+s)},i=(e,t,s)=>(ze(e,t,"read from private field"),s?s.call(e):t.get(e)),d=(e,t,s)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,s)},T=(e,t,s,r)=>(ze(e,t,"write to private field"),t.set(e,s),s),it=(e,t,s,r)=>({set _(a){T(e,t,a)},get _(){return i(e,t,r)}}),m=(e,t,s)=>(ze(e,t,"access private method"),s),p=new Uint8Array(8),I=new DataView(p.buffer),y=e=>[(e%256+256)%256],c=e=>(I.setUint16(0,e,!1),[p[0],p[1]]),st=e=>(I.setInt16(0,e,!1),[p[0],p[1]]),Le=e=>(I.setUint32(0,e,!1),[p[1],p[2],p[3]]),n=e=>(I.setUint32(0,e,!1),[p[0],p[1],p[2],p[3]]),rt=e=>(I.setInt32(0,e,!1),[p[0],p[1],p[2],p[3]]),V=e=>(I.setUint32(0,Math.floor(e/2**32),!1),I.setUint32(4,e,!1),[p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]]),Ee=e=>(I.setInt16(0,2**8*e,!1),[p[0],p[1]]),B=e=>(I.setInt32(0,2**16*e,!1),[p[0],p[1],p[2],p[3]]),we=e=>(I.setInt32(0,2**30*e,!1),[p[0],p[1],p[2],p[3]]),z=(e,t=!1)=>{let s=Array(e.length).fill(null).map((r,a)=>e.charCodeAt(a));return t&&s.push(0),s},he=e=>e&&e[e.length-1],Ae=e=>{let t;for(let s of e)(!t||s.presentationTimestamp>t.presentationTimestamp)&&(t=s);return t},O=(e,t,s=!0)=>{let r=e*t;return s?Math.round(r):r},Ve=e=>{let t=e*(Math.PI/180),s=Math.cos(t),r=Math.sin(t);return[s,r,0,-r,s,0,0,0,1]},Pe=Ve(0),je=e=>[B(e[0]),B(e[1]),we(e[2]),B(e[3]),B(e[4]),we(e[5]),B(e[6]),B(e[7]),we(e[8])],Z=e=>!e||typeof e!="object"?e:Array.isArray(e)?e.map(Z):Object.fromEntries(Object.entries(e).map(([t,s])=>[t,Z(s)])),H=e=>e>=0&&e<2**32,g=(e,t,s)=>({type:e,contents:t&&new Uint8Array(t.flat(10)),children:s}),w=(e,t,s,r,a)=>g(e,[y(t),Le(s),r??[]],a),at=e=>{let t=512;return e.fragmented?g("ftyp",[z("iso5"),n(t),z("iso5"),z("iso6"),z("mp41")]):g("ftyp",[z("isom"),n(t),z("isom"),e.holdsAvc?z("avc1"):[],z("mp41")])},ve=e=>({type:"mdat",largeSize:e}),nt=e=>({type:"free",size:e}),ie=(e,t,s=!1)=>g("moov",null,[ot(t,e),...e.map(r=>ht(r,t)),s?Wt(e):null]),ot=(e,t)=>{let s=O(Math.max(0,...t.filter(l=>l.samples.length>0).map(l=>{const f=Ae(l.samples);return f.presentationTimestamp+f.duration})),ye),r=Math.max(...t.map(l=>l.id))+1,a=!H(e)||!H(s),o=a?V:n;return w("mvhd",+a,0,[o(e),o(e),n(ye),o(s),B(1),Ee(1),Array(10).fill(0),je(Pe),Array(24).fill(0),n(r)])},ht=(e,t)=>g("trak",null,[lt(e,t),ft(e,t)]),lt=(e,t)=>{let s=Ae(e.samples),r=O(s?s.presentationTimestamp+s.duration:0,ye),a=!H(t)||!H(r),o=a?V:n,l;return e.info.type==="video"?l=typeof e.info.rotation=="number"?Ve(e.info.rotation):e.info.rotation:l=Pe,w("tkhd",+a,3,[o(t),o(t),n(e.id),n(0),o(r),Array(8).fill(0),c(0),c(0),Ee(e.info.type==="audio"?1:0),c(0),je(l),B(e.info.type==="video"?e.info.width:0),B(e.info.type==="video"?e.info.height:0)])},ft=(e,t)=>g("mdia",null,[ut(e,t),dt(e.info.type==="video"?"vide":"soun"),mt(e)]),ut=(e,t)=>{let s=Ae(e.samples),r=O(s?s.presentationTimestamp+s.duration:0,e.timescale),a=!H(t)||!H(r),o=a?V:n;return w("mdhd",+a,0,[o(t),o(t),n(e.timescale),o(r),c(21956),c(0)])},dt=e=>w("hdlr",0,0,[z("mhlr"),z(e),n(0),n(0),n(0),z("mp4-muxer-hdlr",!0)]),mt=e=>g("minf",null,[e.info.type==="video"?pt():ct(),wt(),Ct(e)]),pt=()=>w("vmhd",0,1,[c(0),c(0),c(0),c(0)]),ct=()=>w("smhd",0,0,[c(0),c(0)]),wt=()=>g("dinf",null,[vt()]),vt=()=>w("dref",0,0,[n(1)],[gt()]),gt=()=>w("url ",0,1),Ct=e=>{const t=e.compositionTimeOffsetTable.length>1||e.compositionTimeOffsetTable.some(s=>s.sampleCompositionTimeOffset!==0);return g("stbl",null,[yt(e),Bt(e),Ot(e),It(e),Mt(e),Dt(e),t?Ut(e):null])},yt=e=>w("stsd",0,0,[n(1)],[e.info.type==="video"?Tt(Ht[e.info.codec],e):zt(Xt[e.info.codec],e)]),Tt=(e,t)=>g(e,[Array(6).fill(0),c(1),c(0),c(0),Array(12).fill(0),c(t.info.width),c(t.info.height),n(4718592),n(4718592),n(0),c(1),Array(32).fill(0),c(24),st(65535)],[qt[t.info.codec](t)]),St=e=>e.info.decoderConfig&&g("avcC",[...new Uint8Array(e.info.decoderConfig.description)]),bt=e=>e.info.decoderConfig&&g("hvcC",[...new Uint8Array(e.info.decoderConfig.description)]),kt=e=>{if(!e.info.decoderConfig)return null;let t=e.info.decoderConfig;if(!t.colorSpace)throw new Error("'colorSpace' is required in the decoder config for VP9.");let s=t.codec.split("."),r=Number(s[1]),a=Number(s[2]),f=(Number(s[3])<<4)+(0<<1)+Number(t.colorSpace.fullRange);return w("vpcC",1,0,[y(r),y(a),y(f),y(2),y(2),y(2),c(0)])},_t=()=>{let s=(1<<7)+1;return g("av1C",[s,0,0,0])},zt=(e,t)=>g(e,[Array(6).fill(0),c(1),c(0),c(0),n(0),c(t.info.numberOfChannels),c(16),c(0),c(0),B(t.info.sampleRate)],[Gt[t.info.codec](t)]),Et=e=>{let t=new Uint8Array(e.info.decoderConfig.description);return w("esds",0,0,[n(58753152),y(32+t.byteLength),c(1),y(0),n(75530368),y(18+t.byteLength),y(64),y(21),Le(0),n(130071),n(130071),n(92307584),y(t.byteLength),...t,n(109084800),y(1),y(2)])},At=e=>{let t=3840,s=0;const r=e.info.decoderConfig?.description;if(r){if(r.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.");const a=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);t=a.getUint16(10,!0),s=a.getInt16(14,!0)}return g("dOps",[y(0),y(e.info.numberOfChannels),c(t),n(e.info.sampleRate),Ee(s),y(0)])},Bt=e=>w("stts",0,0,[n(e.timeToSampleTable.length),e.timeToSampleTable.map(t=>[n(t.sampleCount),n(t.sampleDelta)])]),Ot=e=>{if(e.samples.every(s=>s.type==="key"))return null;let t=[...e.samples.entries()].filter(([,s])=>s.type==="key");return w("stss",0,0,[n(t.length),t.map(([s])=>n(s+1))])},It=e=>w("stsc",0,0,[n(e.compactlyCodedChunkTable.length),e.compactlyCodedChunkTable.map(t=>[n(t.firstChunk),n(t.samplesPerChunk),n(1)])]),Mt=e=>w("stsz",0,0,[n(0),n(e.samples.length),e.samples.map(t=>n(t.size))]),Dt=e=>e.finalizedChunks.length>0&&he(e.finalizedChunks).offset>=2**32?w("co64",0,0,[n(e.finalizedChunks.length),e.finalizedChunks.map(t=>V(t.offset))]):w("stco",0,0,[n(e.finalizedChunks.length),e.finalizedChunks.map(t=>n(t.offset))]),Ut=e=>w("ctts",0,0,[n(e.compositionTimeOffsetTable.length),e.compositionTimeOffsetTable.map(t=>[n(t.sampleCount),n(t.sampleCompositionTimeOffset)])]),Wt=e=>g("mvex",null,e.map(xt)),xt=e=>w("trex",0,0,[n(e.id),n(1),n(0),n(0),n(0)]),Re=(e,t)=>g("moof",null,[Nt(e),...t.map(Ft)]),Nt=e=>w("mfhd",0,0,[n(e)]),$e=e=>{let t=0,s=0,r=0,a=0,o=e.type==="delta";return s|=+o,o?t|=1:t|=2,t<<24|s<<16|r<<8|a},Ft=e=>g("traf",null,[Rt(e),Lt(e),Vt(e)]),Rt=e=>{let t=0;t|=8,t|=16,t|=32,t|=131072;let s=e.currentChunk.samples[1]??e.currentChunk.samples[0],r={duration:s.timescaleUnitsToNextSample,size:s.size,flags:$e(s)};return w("tfhd",0,t,[n(e.id),n(r.duration),n(r.size),n(r.flags)])},Lt=e=>w("tfdt",1,0,[V(O(e.currentChunk.startTimestamp,e.timescale))]),Vt=e=>{let t=e.currentChunk.samples.map(M=>M.timescaleUnitsToNextSample),s=e.currentChunk.samples.map(M=>M.size),r=e.currentChunk.samples.map($e),a=e.currentChunk.samples.map(M=>O(M.presentationTimestamp-M.decodeTimestamp,e.timescale)),o=new Set(t),l=new Set(s),f=new Set(r),v=new Set(a),S=f.size===2&&r[0]!==r[1],U=o.size>1,X=l.size>1,Ne=!S&&f.size>1,Fe=v.size>1||[...v].some(M=>M!==0),W=0;return W|=1,W|=4*+S,W|=256*+U,W|=512*+X,W|=1024*+Ne,W|=2048*+Fe,w("trun",1,W,[n(e.currentChunk.samples.length),n(e.currentChunk.offset-e.currentChunk.moofOffset||0),S?n(r[0]):[],e.currentChunk.samples.map((M,te)=>[U?n(t[te]):[],X?n(s[te]):[],Ne?n(r[te]):[],Fe?rt(a[te]):[]])])},Pt=e=>g("mfra",null,[...e.map(jt),$t()]),jt=(e,t)=>w("tfra",1,0,[n(e.id),n(63),n(e.finalizedChunks.length),e.finalizedChunks.map(r=>[V(O(r.startTimestamp,e.timescale)),V(r.moofOffset),n(t+1),n(1),n(1)])]),$t=()=>w("mfro",0,0,[n(0)]),Ht={avc:"avc1",hevc:"hvc1",vp9:"vp09",av1:"av01"},qt={avc:St,hevc:bt,vp9:kt,av1:_t},Xt={aac:"mp4a",opus:"Opus"},Gt={aac:Et,opus:At},ce=class{},Zt=class extends ce{constructor(){super(...arguments),this.buffer=null}},He=class extends ce{constructor(e){if(super(),this.options=e,typeof e!="object")throw new TypeError("StreamTarget requires an options object to be passed to its constructor.");if(e.onData){if(typeof e.onData!="function")throw new TypeError("options.onData, when provided, must be a function.");if(e.onData.length<2)throw new TypeError("options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.")}if(e.chunked!==void 0&&typeof e.chunked!="boolean")throw new TypeError("options.chunked, when provided, must be a boolean.");if(e.chunkSize!==void 0&&(!Number.isInteger(e.chunkSize)||e.chunkSize<=0))throw new TypeError("options.chunkSize, when provided, must be a positive integer.")}},Kt=class extends ce{constructor(e,t){if(super(),this.stream=e,this.options=t,!(e instanceof FileSystemWritableFileStream))throw new TypeError("FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.");if(t!==void 0&&typeof t!="object")throw new TypeError("FileSystemWritableFileStreamTarget's options, when provided, must be an object.");if(t&&t.chunkSize!==void 0&&(!Number.isInteger(t.chunkSize)||t.chunkSize<=0))throw new TypeError("options.chunkSize, when provided, must be a positive integer")}},x,P,Be=class{constructor(){this.pos=0,d(this,x,new Uint8Array(8)),d(this,P,new DataView(i(this,x).buffer)),this.offsets=new WeakMap}seek(e){this.pos=e}writeU32(e){i(this,P).setUint32(0,e,!1),this.write(i(this,x).subarray(0,4))}writeU64(e){i(this,P).setUint32(0,Math.floor(e/2**32),!1),i(this,P).setUint32(4,e,!1),this.write(i(this,x).subarray(0,8))}writeAscii(e){for(let t=0;t<e.length;t++)i(this,P).setUint8(t%8,e.charCodeAt(t)),t%8===7&&this.write(i(this,x));e.length%8!==0&&this.write(i(this,x).subarray(0,e.length%8))}writeBox(e){if(this.offsets.set(e,this.pos),e.contents&&!e.children)this.writeBoxHeader(e,e.size??e.contents.byteLength+8),this.write(e.contents);else{let t=this.pos;if(this.writeBoxHeader(e,0),e.contents&&this.write(e.contents),e.children)for(let a of e.children)a&&this.writeBox(a);let s=this.pos,r=e.size??s-t;this.seek(t),this.writeBoxHeader(e,r),this.seek(s)}}writeBoxHeader(e,t){this.writeU32(e.largeSize?1:t),this.writeAscii(e.type),e.largeSize&&this.writeU64(t)}measureBoxHeader(e){return 8+(e.largeSize?8:0)}patchBox(e){let t=this.pos;this.seek(this.offsets.get(e)),this.writeBox(e),this.seek(t)}measureBox(e){if(e.contents&&!e.children)return this.measureBoxHeader(e)+e.contents.byteLength;{let t=this.measureBoxHeader(e);if(e.contents&&(t+=e.contents.byteLength),e.children)for(let s of e.children)s&&(t+=this.measureBox(s));return t}}};x=new WeakMap;P=new WeakMap;var se,L,J,G,re,ge,Qt=class extends Be{constructor(e){super(),d(this,re),d(this,se,void 0),d(this,L,new ArrayBuffer(2**16)),d(this,J,new Uint8Array(i(this,L))),d(this,G,0),T(this,se,e)}write(e){m(this,re,ge).call(this,this.pos+e.byteLength),i(this,J).set(e,this.pos),this.pos+=e.byteLength,T(this,G,Math.max(i(this,G),this.pos))}finalize(){m(this,re,ge).call(this,this.pos),i(this,se).buffer=i(this,L).slice(0,Math.max(i(this,G),this.pos))}};se=new WeakMap;L=new WeakMap;J=new WeakMap;G=new WeakMap;re=new WeakSet;ge=function(e){let t=i(this,L).byteLength;for(;t<e;)t*=2;if(t===i(this,L).byteLength)return;let s=new ArrayBuffer(t),r=new Uint8Array(s);r.set(i(this,J),0),T(this,L,s),T(this,J,r)};var ae,N,qe=class extends Be{constructor(e){super(),d(this,ae,void 0),d(this,N,[]),T(this,ae,e)}write(e){i(this,N).push({data:e.slice(),start:this.pos}),this.pos+=e.byteLength}flush(){if(i(this,N).length===0)return;let e=[],t=[...i(this,N)].sort((s,r)=>s.start-r.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let s=1;s<t.length;s++){let r=e[e.length-1],a=t[s];a.start<=r.start+r.size?r.size=Math.max(r.size,a.start+a.data.byteLength-r.start):e.push({start:a.start,size:a.data.byteLength})}for(let s of e){s.data=new Uint8Array(s.size);for(let r of i(this,N))s.start<=r.start&&r.start<s.start+s.size&&s.data.set(r.data,r.start-s.start);i(this,ae).options.onData?.(s.data,s.start)}i(this,N).length=0}finalize(){}};ae=new WeakMap;N=new WeakMap;var Yt=2**24,Jt=2,le,E,_,fe,Ce,Oe,Xe,Ie,Ge,K,ue,Ze=class extends Be{constructor(e){if(super(),d(this,fe),d(this,Oe),d(this,Ie),d(this,K),d(this,le,void 0),d(this,E,void 0),d(this,_,[]),T(this,le,e),T(this,E,e.options?.chunkSize??Yt),!Number.isInteger(i(this,E))||i(this,E)<2**10)throw new Error("Invalid StreamTarget options: chunkSize must be an integer not smaller than 1024.")}write(e){m(this,fe,Ce).call(this,e,this.pos),m(this,K,ue).call(this),this.pos+=e.byteLength}finalize(){m(this,K,ue).call(this,!0)}};le=new WeakMap;E=new WeakMap;_=new WeakMap;fe=new WeakSet;Ce=function(e,t){let s=i(this,_).findIndex(f=>f.start<=t&&t<f.start+i(this,E));s===-1&&(s=m(this,Ie,Ge).call(this,t));let r=i(this,_)[s],a=t-r.start,o=e.subarray(0,Math.min(i(this,E)-a,e.byteLength));r.data.set(o,a);let l={start:a,end:a+o.byteLength};if(m(this,Oe,Xe).call(this,r,l),r.written[0].start===0&&r.written[0].end===i(this,E)&&(r.shouldFlush=!0),i(this,_).length>Jt){for(let f=0;f<i(this,_).length-1;f++)i(this,_)[f].shouldFlush=!0;m(this,K,ue).call(this)}o.byteLength<e.byteLength&&m(this,fe,Ce).call(this,e.subarray(o.byteLength),t+o.byteLength)};Oe=new WeakSet;Xe=function(e,t){let s=0,r=e.written.length-1,a=-1;for(;s<=r;){let o=Math.floor(s+(r-s+1)/2);e.written[o].start<=t.start?(s=o+1,a=o):r=o-1}for(e.written.splice(a+1,0,t),(a===-1||e.written[a].end<t.start)&&a++;a<e.written.length-1&&e.written[a].end>=e.written[a+1].start;)e.written[a].end=Math.max(e.written[a].end,e.written[a+1].end),e.written.splice(a+1,1)};Ie=new WeakSet;Ge=function(e){let s={start:Math.floor(e/i(this,E))*i(this,E),data:new Uint8Array(i(this,E)),written:[],shouldFlush:!1};return i(this,_).push(s),i(this,_).sort((r,a)=>r.start-a.start),i(this,_).indexOf(s)};K=new WeakSet;ue=function(e=!1){for(let t=0;t<i(this,_).length;t++){let s=i(this,_)[t];if(!(!s.shouldFlush&&!e)){for(let r of s.written)i(this,le).options.onData?.(s.data.subarray(r.start,r.end),s.start+r.start);i(this,_).splice(t--,1)}}};var ei=class extends Ze{constructor(e){super(new He({onData:(t,s)=>e.stream.write({type:"write",data:t,position:s}),chunkSize:e.options?.chunkSize}))}},ye=1e3,ti=["avc","hevc","vp9","av1"],ii=["aac","opus"],si=2082844800,ri=["strict","offset","cross-track-offset"],h,u,de,k,b,C,j,$,Me,F,R,Q,Te,Ke,Se,Qe,De,Ye,be,Je,Ue,et,ne,ke,A,D,We,tt,Y,me,pe,xe,q,ee,oe,_e,ai=class{constructor(e){if(d(this,Te),d(this,Se),d(this,De),d(this,be),d(this,Ue),d(this,ne),d(this,A),d(this,We),d(this,Y),d(this,pe),d(this,q),d(this,oe),d(this,h,void 0),d(this,u,void 0),d(this,de,void 0),d(this,k,void 0),d(this,b,null),d(this,C,null),d(this,j,Math.floor(Date.now()/1e3)+si),d(this,$,[]),d(this,Me,1),d(this,F,[]),d(this,R,[]),d(this,Q,!1),m(this,Te,Ke).call(this,e),e.video=Z(e.video),e.audio=Z(e.audio),e.fastStart=Z(e.fastStart),this.target=e.target,T(this,h,{firstTimestampBehavior:"strict",...e}),e.target instanceof Zt)T(this,u,new Qt(e.target));else if(e.target instanceof He)T(this,u,e.target.options?.chunked?new Ze(e.target):new qe(e.target));else if(e.target instanceof Kt)T(this,u,new ei(e.target));else throw new Error(`Invalid target: ${e.target}`);m(this,be,Je).call(this),m(this,Se,Qe).call(this)}addVideoChunk(e,t,s,r){if(!(e instanceof EncodedVideoChunk))throw new TypeError("addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.");if(t&&typeof t!="object")throw new TypeError("addVideoChunk's second argument (meta), when provided, must be an object.");if(s!==void 0&&(!Number.isFinite(s)||s<0))throw new TypeError("addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.");if(r!==void 0&&!Number.isFinite(r))throw new TypeError("addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.");let a=new Uint8Array(e.byteLength);e.copyTo(a),this.addVideoChunkRaw(a,e.type,s??e.timestamp,e.duration,t,r)}addVideoChunkRaw(e,t,s,r,a,o){if(!(e instanceof Uint8Array))throw new TypeError("addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.");if(t!=="key"&&t!=="delta")throw new TypeError("addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.");if(!Number.isFinite(s)||s<0)throw new TypeError("addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.");if(!Number.isFinite(r)||r<0)throw new TypeError("addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.");if(a&&typeof a!="object")throw new TypeError("addVideoChunkRaw's fifth argument (meta), when provided, must be an object.");if(o!==void 0&&!Number.isFinite(o))throw new TypeError("addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.");if(m(this,oe,_e).call(this),!i(this,h).video)throw new Error("No video track declared.");if(typeof i(this,h).fastStart=="object"&&i(this,b).samples.length===i(this,h).fastStart.expectedVideoChunks)throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${i(this,h).fastStart.expectedVideoChunks}).`);let l=m(this,ne,ke).call(this,i(this,b),e,t,s,r,a,o);if(i(this,h).fastStart==="fragmented"&&i(this,C)){for(;i(this,R).length>0&&i(this,R)[0].decodeTimestamp<=l.decodeTimestamp;){let f=i(this,R).shift();m(this,A,D).call(this,i(this,C),f)}l.decodeTimestamp<=i(this,C).lastDecodeTimestamp?m(this,A,D).call(this,i(this,b),l):i(this,F).push(l)}else m(this,A,D).call(this,i(this,b),l)}addAudioChunk(e,t,s){if(!(e instanceof EncodedAudioChunk))throw new TypeError("addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.");if(t&&typeof t!="object")throw new TypeError("addAudioChunk's second argument (meta), when provided, must be an object.");if(s!==void 0&&(!Number.isFinite(s)||s<0))throw new TypeError("addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.");let r=new Uint8Array(e.byteLength);e.copyTo(r),this.addAudioChunkRaw(r,e.type,s??e.timestamp,e.duration,t)}addAudioChunkRaw(e,t,s,r,a){if(!(e instanceof Uint8Array))throw new TypeError("addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.");if(t!=="key"&&t!=="delta")throw new TypeError("addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.");if(!Number.isFinite(s)||s<0)throw new TypeError("addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.");if(!Number.isFinite(r)||r<0)throw new TypeError("addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.");if(a&&typeof a!="object")throw new TypeError("addAudioChunkRaw's fifth argument (meta), when provided, must be an object.");if(m(this,oe,_e).call(this),!i(this,h).audio)throw new Error("No audio track declared.");if(typeof i(this,h).fastStart=="object"&&i(this,C).samples.length===i(this,h).fastStart.expectedAudioChunks)throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${i(this,h).fastStart.expectedAudioChunks}).`);let o=m(this,ne,ke).call(this,i(this,C),e,t,s,r,a);if(i(this,h).fastStart==="fragmented"&&i(this,b)){for(;i(this,F).length>0&&i(this,F)[0].decodeTimestamp<=o.decodeTimestamp;){let l=i(this,F).shift();m(this,A,D).call(this,i(this,b),l)}o.decodeTimestamp<=i(this,b).lastDecodeTimestamp?m(this,A,D).call(this,i(this,C),o):i(this,R).push(o)}else m(this,A,D).call(this,i(this,C),o)}finalize(){if(i(this,Q))throw new Error("Cannot finalize a muxer more than once.");if(i(this,h).fastStart==="fragmented"){for(let t of i(this,F))m(this,A,D).call(this,i(this,b),t);for(let t of i(this,R))m(this,A,D).call(this,i(this,C),t);m(this,pe,xe).call(this,!1)}else i(this,b)&&m(this,Y,me).call(this,i(this,b)),i(this,C)&&m(this,Y,me).call(this,i(this,C));let e=[i(this,b),i(this,C)].filter(Boolean);if(i(this,h).fastStart==="in-memory"){let t;for(let r=0;r<2;r++){let a=ie(e,i(this,j)),o=i(this,u).measureBox(a);t=i(this,u).measureBox(i(this,k));let l=i(this,u).pos+o+t;for(let f of i(this,$)){f.offset=l;for(let{data:v}of f.samples)l+=v.byteLength,t+=v.byteLength}if(l<2**32)break;t>=2**32&&(i(this,k).largeSize=!0)}let s=ie(e,i(this,j));i(this,u).writeBox(s),i(this,k).size=t,i(this,u).writeBox(i(this,k));for(let r of i(this,$))for(let a of r.samples)i(this,u).write(a.data),a.data=null}else if(i(this,h).fastStart==="fragmented"){let t=i(this,u).pos,s=Pt(e);i(this,u).writeBox(s);let r=i(this,u).pos-t;i(this,u).seek(i(this,u).pos-4),i(this,u).writeU32(r)}else{let t=i(this,u).offsets.get(i(this,k)),s=i(this,u).pos-t;i(this,k).size=s,i(this,k).largeSize=s>=2**32,i(this,u).patchBox(i(this,k));let r=ie(e,i(this,j));if(typeof i(this,h).fastStart=="object"){i(this,u).seek(i(this,de)),i(this,u).writeBox(r);let a=t-i(this,u).pos;i(this,u).writeBox(nt(a))}else i(this,u).writeBox(r)}m(this,q,ee).call(this),i(this,u).finalize(),T(this,Q,!0)}};h=new WeakMap;u=new WeakMap;de=new WeakMap;k=new WeakMap;b=new WeakMap;C=new WeakMap;j=new WeakMap;$=new WeakMap;Me=new WeakMap;F=new WeakMap;R=new WeakMap;Q=new WeakMap;Te=new WeakSet;Ke=function(e){if(typeof e!="object")throw new TypeError("The muxer requires an options object to be passed to its constructor.");if(!(e.target instanceof ce))throw new TypeError("The target must be provided and an instance of Target.");if(e.video){if(!ti.includes(e.video.codec))throw new TypeError(`Unsupported video codec: ${e.video.codec}`);if(!Number.isInteger(e.video.width)||e.video.width<=0)throw new TypeError(`Invalid video width: ${e.video.width}. Must be a positive integer.`);if(!Number.isInteger(e.video.height)||e.video.height<=0)throw new TypeError(`Invalid video height: ${e.video.height}. Must be a positive integer.`);const t=e.video.rotation;if(typeof t=="number"&&![0,90,180,270].includes(t))throw new TypeError(`Invalid video rotation: ${t}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(t)&&(t.length!==9||t.some(s=>typeof s!="number")))throw new TypeError(`Invalid video transformation matrix: ${t.join()}`);if(e.video.frameRate!==void 0&&(!Number.isInteger(e.video.frameRate)||e.video.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.video.frameRate}. Must be a positive integer.`)}if(e.audio){if(!ii.includes(e.audio.codec))throw new TypeError(`Unsupported audio codec: ${e.audio.codec}`);if(!Number.isInteger(e.audio.numberOfChannels)||e.audio.numberOfChannels<=0)throw new TypeError(`Invalid number of audio channels: ${e.audio.numberOfChannels}. Must be a positive integer.`);if(!Number.isInteger(e.audio.sampleRate)||e.audio.sampleRate<=0)throw new TypeError(`Invalid audio sample rate: ${e.audio.sampleRate}. Must be a positive integer.`)}if(e.firstTimestampBehavior&&!ri.includes(e.firstTimestampBehavior))throw new TypeError(`Invalid first timestamp behavior: ${e.firstTimestampBehavior}`);if(typeof e.fastStart=="object"){if(e.video){if(e.fastStart.expectedVideoChunks===void 0)throw new TypeError("'fastStart' is an object but is missing property 'expectedVideoChunks'.");if(!Number.isInteger(e.fastStart.expectedVideoChunks)||e.fastStart.expectedVideoChunks<0)throw new TypeError("'expectedVideoChunks' must be a non-negative integer.")}if(e.audio){if(e.fastStart.expectedAudioChunks===void 0)throw new TypeError("'fastStart' is an object but is missing property 'expectedAudioChunks'.");if(!Number.isInteger(e.fastStart.expectedAudioChunks)||e.fastStart.expectedAudioChunks<0)throw new TypeError("'expectedAudioChunks' must be a non-negative integer.")}}else if(![!1,"in-memory","fragmented"].includes(e.fastStart))throw new TypeError("'fastStart' option must be false, 'in-memory', 'fragmented' or an object.")};Se=new WeakSet;Qe=function(){if(i(this,u).writeBox(at({holdsAvc:i(this,h).video?.codec==="avc",fragmented:i(this,h).fastStart==="fragmented"})),T(this,de,i(this,u).pos),i(this,h).fastStart==="in-memory")T(this,k,ve(!1));else if(i(this,h).fastStart!=="fragmented"){if(typeof i(this,h).fastStart=="object"){let e=m(this,De,Ye).call(this);i(this,u).seek(i(this,u).pos+e)}T(this,k,ve(!0)),i(this,u).writeBox(i(this,k))}m(this,q,ee).call(this)};De=new WeakSet;Ye=function(){if(typeof i(this,h).fastStart!="object")return;let e=0,t=[i(this,h).fastStart.expectedVideoChunks,i(this,h).fastStart.expectedAudioChunks];for(let s of t)s&&(e+=8*Math.ceil(2/3*s),e+=4*s,e+=12*Math.ceil(2/3*s),e+=4*s,e+=8*s);return e+=4096,e};be=new WeakSet;Je=function(){if(i(this,h).video&&T(this,b,{id:1,info:{type:"video",codec:i(this,h).video.codec,width:i(this,h).video.width,height:i(this,h).video.height,rotation:i(this,h).video.rotation??0,decoderConfig:null},timescale:i(this,h).video.frameRate??57600,samples:[],finalizedChunks:[],currentChunk:null,firstDecodeTimestamp:void 0,lastDecodeTimestamp:-1,timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,compactlyCodedChunkTable:[]}),i(this,h).audio&&(T(this,C,{id:i(this,h).video?2:1,info:{type:"audio",codec:i(this,h).audio.codec,numberOfChannels:i(this,h).audio.numberOfChannels,sampleRate:i(this,h).audio.sampleRate,decoderConfig:null},timescale:i(this,h).audio.sampleRate,samples:[],finalizedChunks:[],currentChunk:null,firstDecodeTimestamp:void 0,lastDecodeTimestamp:-1,timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,compactlyCodedChunkTable:[]}),i(this,h).audio.codec==="aac")){let e=m(this,Ue,et).call(this,2,i(this,h).audio.sampleRate,i(this,h).audio.numberOfChannels);i(this,C).info.decoderConfig={codec:i(this,h).audio.codec,description:e,numberOfChannels:i(this,h).audio.numberOfChannels,sampleRate:i(this,h).audio.sampleRate}}};Ue=new WeakSet;et=function(e,t,s){let a=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350].indexOf(t),o=s,l="";l+=e.toString(2).padStart(5,"0"),l+=a.toString(2).padStart(4,"0"),a===15&&(l+=t.toString(2).padStart(24,"0")),l+=o.toString(2).padStart(4,"0");let f=Math.ceil(l.length/8)*8;l=l.padEnd(f,"0");let v=new Uint8Array(l.length/8);for(let S=0;S<l.length;S+=8)v[S/8]=parseInt(l.slice(S,S+8),2);return v};ne=new WeakSet;ke=function(e,t,s,r,a,o,l){let f=r/1e6,v=(r-(l??0))/1e6,S=a/1e6,U=m(this,We,tt).call(this,f,v,e);return f=U.presentationTimestamp,v=U.decodeTimestamp,o?.decoderConfig&&(e.info.decoderConfig===null?e.info.decoderConfig=o.decoderConfig:Object.assign(e.info.decoderConfig,o.decoderConfig)),{presentationTimestamp:f,decodeTimestamp:v,duration:S,data:t,size:t.byteLength,type:s,timescaleUnitsToNextSample:O(S,e.timescale)}};A=new WeakSet;D=function(e,t){i(this,h).fastStart!=="fragmented"&&e.samples.push(t);const s=O(t.presentationTimestamp-t.decodeTimestamp,e.timescale);if(e.lastTimescaleUnits!==null){let a=O(t.decodeTimestamp,e.timescale,!1),o=Math.round(a-e.lastTimescaleUnits);if(e.lastTimescaleUnits+=o,e.lastSample.timescaleUnitsToNextSample=o,i(this,h).fastStart!=="fragmented"){let l=he(e.timeToSampleTable);l.sampleCount===1?(l.sampleDelta=o,l.sampleCount++):l.sampleDelta===o?l.sampleCount++:(l.sampleCount--,e.timeToSampleTable.push({sampleCount:2,sampleDelta:o}));const f=he(e.compositionTimeOffsetTable);f.sampleCompositionTimeOffset===s?f.sampleCount++:e.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:s})}}else e.lastTimescaleUnits=0,i(this,h).fastStart!=="fragmented"&&(e.timeToSampleTable.push({sampleCount:1,sampleDelta:O(t.duration,e.timescale)}),e.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:s}));e.lastSample=t;let r=!1;if(!e.currentChunk)r=!0;else{let a=t.presentationTimestamp-e.currentChunk.startTimestamp;if(i(this,h).fastStart==="fragmented"){let o=i(this,b)??i(this,C);e===o&&t.type==="key"&&a>=1&&(r=!0,m(this,pe,xe).call(this))}else r=a>=.5}r&&(e.currentChunk&&m(this,Y,me).call(this,e),e.currentChunk={startTimestamp:t.presentationTimestamp,samples:[]}),e.currentChunk.samples.push(t)};We=new WeakSet;tt=function(e,t,s){const r=i(this,h).firstTimestampBehavior==="strict",a=s.lastDecodeTimestamp===-1;if(r&&a&&t!==0)throw new Error(`The first chunk for your media track must have a timestamp of 0 (received DTS=${t}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.
  2. If you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.
  3. `);if(i(this,h).firstTimestampBehavior==="offset"||i(this,h).firstTimestampBehavior==="cross-track-offset"){s.firstDecodeTimestamp===void 0&&(s.firstDecodeTimestamp=t);let l;i(this,h).firstTimestampBehavior==="offset"?l=s.firstDecodeTimestamp:l=Math.min(i(this,b)?.firstDecodeTimestamp??1/0,i(this,C)?.firstDecodeTimestamp??1/0),t-=l,e-=l}if(t<s.lastDecodeTimestamp)throw new Error(`Timestamps must be monotonically increasing (DTS went from ${s.lastDecodeTimestamp*1e6} to ${t*1e6}).`);return s.lastDecodeTimestamp=t,{presentationTimestamp:e,decodeTimestamp:t}};Y=new WeakSet;me=function(e){if(i(this,h).fastStart==="fragmented")throw new Error("Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.");if(e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),i(this,$).push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||he(e.compactlyCodedChunkTable).samplesPerChunk!==e.currentChunk.samples.length)&&e.compactlyCodedChunkTable.push({firstChunk:e.finalizedChunks.length,samplesPerChunk:e.currentChunk.samples.length}),i(this,h).fastStart==="in-memory"){e.currentChunk.offset=0;return}e.currentChunk.offset=i(this,u).pos;for(let t of e.currentChunk.samples)i(this,u).write(t.data),t.data=null;m(this,q,ee).call(this)}};pe=new WeakSet;xe=function(e=!0){if(i(this,h).fastStart!=="fragmented")throw new Error("Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.");let t=[i(this,b),i(this,C)].filter(f=>f&&f.currentChunk);if(t.length===0)return;let s=it(this,Me)._++;if(s===1){let f=ie(t,i(this,j),!0);i(this,u).writeBox(f)}let r=i(this,u).pos,a=Re(s,t);i(this,u).writeBox(a);{let f=ve(!1),v=0;for(let U of t)for(let X of U.currentChunk.samples)v+=X.size;let S=i(this,u).measureBox(f)+v;S>=2**32&&(f.largeSize=!0,S=i(this,u).measureBox(f)+v),f.size=S,i(this,u).writeBox(f)}for(let f of t){f.currentChunk.offset=i(this,u).pos,f.currentChunk.moofOffset=r;for(let v of f.currentChunk.samples)i(this,u).write(v.data),v.data=null}let o=i(this,u).pos;i(this,u).seek(i(this,u).offsets.get(a));let l=Re(s,t);i(this,u).writeBox(l),i(this,u).seek(o);for(let f of t)f.finalizedChunks.push(f.currentChunk),i(this,$).push(f.currentChunk),f.currentChunk=null;e&&m(this,q,ee).call(this)};q=new WeakSet;ee=function(){i(this,u)instanceof qe&&i(this,u).flush()};oe=new WeakSet;_e=function(){if(i(this,Q))throw new Error("Cannot add new video or audio chunks after the file has been finalized.")};export{Zt as ArrayBufferTarget,Kt as FileSystemWritableFileStreamTarget,ai as Muxer,He as StreamTarget};
  4. //# sourceMappingURL=mp4-muxer-BBZkcVvS.js.map