A javascript implementation of the Webm Demuxer (matroska). View a demo of a dumux result [here](https://jscodec.github.io/jswebm/) Better examples and reworked api coming soon. # API Proposal ## JsWebm ### Properties Top Level wrapper and interface. * `v
npm install jswebmvideoPackets : Array of demuxed video packetsaudioPackets : Array of demuxed audio packetsdocType : Document typeaudioCodec : Audio codec for the audio trackeof : Boolean, if the end of the file has been reachedqueueData(buffer) : queue an incoming chunck of data, must be sequentialdemux() : Attempts to parse up to 1 new packet, maybe return promise and reject if current buffer runs outjavascript
const demuxer = new JsWebm();
demuxer.queueData(buffer);
while (!demuxer.eof) {
demuxer.demux();
}
console.log(demuxer);
console.log(total video packets : ${demuxer.videoPackets.length});
console.log(total audio packets : ${demuxer.audioPackets.length});
`$3
`Javascript
{
data: ArrayBuffer(3714) {},
isKeyframe: false,
keyframeTimestamp: 0,
timestamp: 0,
}
`
Webm Demuxer
Running the demo
npm install
npm run testChange Log
* V0.0.3
* Working on ogv.js 1.3.1
* Added basic support for Matroska Files
* Added support for Tags Element
* Added Support for Fixed size, and EBML laced elementsAlgorithm Overview
The demuxer holds a queue of arrayBuffers which are sent in from the main player controller.
The difficulty lies in the way the buffers come in. In order to achieve progressive downloading, we must parse the data
as it comes in, but it is not possible to ensure that the elements will be completely contained in one chunk
ie: the elements can be arbitrarily broken up across one ore more incoming buffers.__Main goal__ : To parse the incoming buffers without unnecessary rewrites. The only write will be the time the final frame buffer is made which will be sent off to the decoders.
$3
* queueData(data) receives arrayBuffer chunks of arbitrary length, adds to queue
* demux()` is called from main loopThe algorithm will then work as follows:
* Read first byte
* Calculate byte width of Vint
* Test if there are enough bytes available in current buffer
* If yes, read entire Vint
* If not, use buffered read method saving state at each position (more overhead)
* At each stage check if there are remaining bytes
* If no, dequeue buffer
* If no more buffers, return null or false (can't decide yet)
* Upon next call to process, must pick up where it left off
__Example of Element spread across 2 buffers__
!Alt
__Closeup of Vint or Element ID__
!Alt
Coming Soon!