ts-ebml
ebml encoder and decoder written in TypeScript.
Fork of node-ebml
It is a fork of https://github.com/themasch/node-ebml
install
npm install ts-ebml --save
usage
show EBML structure on console
$ ts-ebml foo.webm
0 m 0 EBML
5 u 1 EBMLVersion 1
9 u 1 EBMLReadVersion 1
13 u 1 EBMLMaxIDLength 4
17 u 1 EBMLMaxSizeLength 8
21 s 1 DocType webm
28 u 1 DocTypeVersion 2
32 u 1 DocTypeReadVersion 2
36 m 0 Segment
48 m 1 Info
53 u 2 TimecodeScale 1000000
...
try to convert a MediaRecorder WebM to seekable WebM
$ ts-ebml -s input.webm | cat > seekable.webm
node
import * as ebml from 'ts-ebml';
const fs = require('fs');
const decoder = new ebml.Decoder();
fs.createReadStream('media/test.webm').on('data', (buf)=>{
const ebmlElms = decoder.decode(buf);
console.log(ebmlElms);
});
browser
<script src="./dist/ebml.min.js"></script>
<script>
const decoder = new ebml.Decoder();
fetch('media/test.webm')
.then((res)=> res.arrayBuffer() )
.then((buf)=>{
const ebmlElms = decoder.decode(buf);
console.log(ebmlElms);
});
</script>
bundle
import * as ebml from 'ts-ebml';
const decoder = new ebml.Decoder();
fetch('media/test.webm')
.then((res)=> res.arrayBuffer() )
.then((buf)=>{
const ebmlElms = decoder.decode(buf);
console.log(ebmlElms);
});
features
- get WebP frame from MediaRecorder WebM VP8 Stream
- create seekable webm from media-recoder
- create playable webm to media-stream-api from media-recorder
see src/test.ts
and src/example_seekable.ts
stable API
class Decoder {
constructor();
decode(chunk: ArrayBuffer): EBMLElementDetail[];
}
class Encoder {
constructor();
encode(elms: EBMLElementBuffer[]): ArrayBuffer;
}
type EBMLElementBuffer = MasterElement | ChildElementBuffer;
type EBMLElementDetail = (MasterElement | ChildElementValue) & ElementDetail;
type MasterElement = {
name: string;
type: "m";
isEnd: boolean;
unknownSize?: boolean;
};
type ChildElementBuffer = {
name: string;
type: "u" | "i" | "f" | "s" | "8" | "b" | "d";
data: Buffer;
};
type ChildElementValue = ChildElementBuffer & {
value: number|string|Buffer|Date;
};
type ElementDetail = {
tagStart: number;
tagEnd: number;
sizeStart: number;
sizeEnd: number;
dataStart: number;
dataEnd: number;
};
namespace tools {
export function readVint(buffer: Buffer, start: number): null | ({length: number; value: number; });
export function writeVint(val: number): Buffer;
export function readBlock(buf: ArrayBuffer): EBML.SimpleBlock;
}
develop
npm install
npm run build
npm run lint
npm run doc
npm run lint
npm test
debugging tools
license
MIT
related info
related issues
media recorder seekable webm
chrome
firefox
others
media recorder media source gap
chrome
others
chrome
firefox
related works