Kontainer
A media file format generator/parser that exposes a React-like API.
Kontainer aims to fully support the MP4 (ISO Base Media file format: ISO/IEC 14496-12) and WebM file format. The library can be used on Node.js and in the browser.
Install
Overview
API
A media file like MP4 and WebM is composed of nested objects. In Kontainer, each object, e.g. MP4 Box, is represented as a KontainerElement
which is similar to the ReactElement
.
The actual media data (audio and video chunks) and the metadata are represented as a props
object and passed to the KontainerElement
as its attributes.
; { Kontainer; // format (mp4|webm) needs to be set before any API call thiswidth = width; thisheight = height; } { return <file> <ftyp majorBrand="isom" /> <moov> <mvhd creationTime= modificationTime= timeScale=1 nextTrackId=4 /> <trak> <tkhd creationTime= modificationTime= trackId=1 width=thiswidth height=thisheight /> <mdia> ... </mdia> </trak> </moov> </file> ; }
The above code can be transpiled into the calls to createElement()
using babel
and a dedicated plugin.
// Kontainer.createElement() // Accepts: type, props, children... // Returns: KontainerElement return Kontainer;
Once an element is obtained, it can be serialized into a byte stream using render()
.
// Kontainer.render() // Accepts: KontainerElement // Returns: Buffer (in node) or ArrayBuffer (in browser) that contains a media stream buffer = Kontainer;
On the other hand, you can create a KontainerElement from a byte stream.
// Kontainer.createElementFromBuffer() // Accepts: Buffer (in node) or ArrayBuffer (in browser) that contains a media stream [, offset=0] // Returns: KontainerElement. element = Kontainer;
You can also create your hook and process a byte stream progressively. (This works only for Node.js)
const input = fs; const transform = Kontainer; input;
JSX
To transpile JSX into createElement()
calls together with your ES.next code, you need to install babel
and its plugins.
$ npm install babel-cli
$ npm install babel-preset-es2015
$ npm install babel-plugin-transform-kontainer-js
Put a .babelrc file in the source directories that contain JSX.
"presets": "es2015" "plugins": "transform-kontainer-js"
Then use the babel
command to transpile the code.
$ babel src/ -d dist/
See the plugin code for the details.
CLI
A simple parser for displaying the structure of a media file.
Usage:
kontainer filePath [options]
Example:
kontainer /path/to/file
cat /path/to/file | kontainer
Options:
-h, --help Print help
-v, --version Print version
Development
// Install
$ git clone git@github.com:kuu/Kontainer.git
$ cd Kontainer
$ npm install
// Test
$ npm test
// Build client libs
$ npm run build
// --> ./lib/kontainer.deb.js (uncompressed with debug messages)
// --> ./lib/kontainer.js (uncompressed)
// --> ./lib/kontainer.min.js (compressed)
// --> ./lib/kontainer.map.js (source map)