ts-ebml-esm
Version:
ebml decoder and encoder
91 lines (90 loc) • 3.24 kB
JavaScript
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);
}
});
}