ts-ebml-esm
Version:
ebml decoder and encoder
3 lines (2 loc) • 2.55 kB
JavaScript
;const u=require("./EBMLDecoder.cjs.js"),c=require("./tools-Bzvjx2Tw.cjs"),B=require("./EBMLReader.cjs.js"),b=require("commander"),p=require("node:fs"),v=require("../package.json").version;b.program.version(v).usage("[options] <*.webm>").option("-s, --seekable","try convert MediaRecorder WebM to seekable WebM and write buffer stdout, like `ts-ebml -s not_seekable.webm | cat > seekable.webm`").option("-k, --keyframe","TimestampScale & Timestamp & SimpleBlock(VideoTrack && keyframe) ebml elements pass filter for thumbnails(Random Access Points)").arguments("<*.webm>").parse(process.argv);const{args:d}=b.program;d.length<1&&process.exit();const k=b.program.opts();if(k.seekable){const l=new u,t=new B;t.logging=!1,t.drop_default_duration=!1;const n=p.readFileSync(d[0]),o=l.decode(n);for(const e of o)t.read(e);t.stop();const s=c.makeMetadataSeekable(t.metadatas,t.duration,t.cues),r=n.subarray(t.metadataSize),a=Buffer.from(c.concat([Buffer.from(s),r]).buffer);process.stdout.write(a)}else if(k.keyframe){const l=new u;let t=-1,n=-1,o="";const s={};p.createReadStream(d[0]).on("data",r=>{const a=l.decode(r);for(const e of a)if(e.type==="m"&&e.name==="TrackEntry"&&e.isEnd)s[n]={TrackType:t,CodecID:o},t=-1,n=-1,o="";else if(e.type==="u"&&e.name==="TrackType")t=e.value;else if(e.type==="u"&&e.name==="TrackNumber")n=e.value;else if(e.type==="s"&&e.name==="CodecID")o=e.value;else if(e.type==="u"&&e.name==="TimestampScale")process.stdout.write(Buffer.from(new c.EBMLEncoder().encode([e])));else if(e.type==="u"&&e.name==="Timestamp")process.stdout.write(Buffer.from(new c.EBMLEncoder().encode([e])));else if(e.type==="b"&&e.name==="SimpleBlock"){const m=c.ebmlBlock(e.data),{TrackType:f,CodecID:i}=s[m.trackNumber];f===1&&m.keyframe&&(i==="V_VP9"||i==="V_VP8")&&process.stdout.write(Buffer.from(new c.EBMLEncoder().encode([e])))}})}else{const l=new u;p.createReadStream(d[0]).on("data",t=>{const n=l.decode(t);for(const o of n){const{name:s,type:r,tagStart:a,level:e}=o;if(o.type==="m")o.isEnd||console.log(`${a} ${r} ${e} ${s}`);else if(o.type==="b")if(o.name==="SimpleBlock"){const{discardable:m,frames:f,invisible:i,keyframe:y,timecode:$,trackNumber:g}=c.ebmlBlock(o.value);console.log(`${a} ${r} ${e} ${s}`,`track:${g} timestamp:${$} keyframe:${y} invisible:${i} discardable:${m} lacying:${f.length}`)}else console.log(`${a} ${r} ${e} ${s}`,`<Buffer ${o.value.byteLength}>`);else o.type==="d"?console.log(`${a} ${r} ${e} ${s}`,c.convertEBMLDateToJSDate(o.value)):console.log(`${a} ${r} ${e} ${s}`,o.value)}})}