UNPKG

ts-ebml-esm

Version:
91 lines (90 loc) 3.24 kB
#!/usr/bin/env node import d from "./EBMLDecoder.es.js"; import { m as w, c as T, E as p, e as k, a as B } from "./tools-CVDSnz1X.js"; import S from "./EBMLReader.es.js"; import { program as b } from "commander"; import u from "node:fs"; const E = require("../package.json").version; b.version(E).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: i } = b; i.length < 1 && process.exit(); const y = b.opts(); if (y.seekable) { const c = new d(), t = new S(); t.logging = !1, t.drop_default_duration = !1; const n = u.readFileSync(i[0]), o = c.decode(n); for (const e of o) t.read(e); t.stop(); const a = w( t.metadatas, t.duration, t.cues ), s = n.subarray(t.metadataSize), r = Buffer.from( T([Buffer.from(a), s]).buffer ); process.stdout.write(r); } else if (y.keyframe) { const c = new d(); let t = -1, n = -1, o = ""; const a = {}; u.createReadStream(i[0]).on("data", (s) => { const r = c.decode(s); for (const e of r) if (e.type === "m" && e.name === "TrackEntry" && e.isEnd) a[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 p().encode([e]))); else if (e.type === "u" && e.name === "Timestamp") process.stdout.write(Buffer.from(new p().encode([e]))); else if (e.type === "b" && e.name === "SimpleBlock") { const m = k(e.data), { TrackType: f, CodecID: l } = a[m.trackNumber]; f === 1 && m.keyframe && (l === "V_VP9" || l === "V_VP8") && process.stdout.write(Buffer.from(new p().encode([e]))); } }); } else { const c = new d(); u.createReadStream(i[0]).on("data", (t) => { const n = c.decode(t); for (const o of n) { const { name: a, type: s, tagStart: r, level: e } = o; if (o.type === "m") o.isEnd || console.log(`${r} ${s} ${e} ${a}`); else if (o.type === "b") if (o.name === "SimpleBlock") { const { discardable: m, frames: f, invisible: l, keyframe: $, timecode: g, trackNumber: v } = k(o.value); console.log( `${r} ${s} ${e} ${a}`, `track:${v} timestamp:${g} keyframe:${$} invisible:${l} discardable:${m} lacying:${f.length}` ); } else console.log( `${r} ${s} ${e} ${a}`, `<Buffer ${o.value.byteLength}>` ); else o.type === "d" ? console.log( `${r} ${s} ${e} ${a}`, B(o.value) ) : console.log(`${r} ${s} ${e} ${a}`, o.value); } }); }