/node-matroska

Matroska library written for nodejs

Primary LanguageJavaScriptGNU General Public License v3.0GPL-3.0

node-matroska

Matroska library written for nodejs

Fork of node-ebml

It is a fork of https://github.com/themasch/node-ebml

VERY Fast parsing

Fast and incomplete parsing of a mkv file: (we keep only metadatas)

var matroska = require('matroska');

var url="http://download.wavetlan.com/SVV/Media/HTTP/mkv/H264_PCM(mkvmerge).mkv";

matroska.Decoder.parseInfoTagsAndAttachments(url, function(error, document) {
	if (error) {
		console.error(error);
		return;
	}

	console.log(document.print());
});

Returns a tree: (format: offset#tagId * node)

         0#0     * Document  [HttpSource url=http://download.wavetlan.com/SVV/Media/HTTP/mkv/H264_PCM(mkvmerge).mkv]
         0#1       * EBML  children[size=40]
         5#2         * EBMLVersion  u[1]=1
         9#3         * EBMLReadVersion  u[1]=1
        13#4         * EBMLMaxIDLength  u[1]=4
        17#5         * EBMLMaxSizeLength  u[1]=8
        21#6         * DocType  s[8]='matroska'
        32#7         * DocTypeVersion  u[1]=2
        36#8         * DocTypeReadVersion  u[1]=2
        40#9       * Segment  children[size=40316440]
        52#10        * SeekHead  children[size=52]
        57#11          * Seek  children[size=15]
        60#12            * SeekID  b[4]=1549a966 => Info
        67#13            * SeekPosition  u[2]=4099  [=>#20]
        72#14          * Seek  children[size=15]
        75#15            * SeekID  b[4]=1654ae6b => Tracks
        82#16            * SeekPosition  u[2]=4248
        87#17          * Seek  children[size=17]
        90#18            * SeekID  b[4]=1c53bb6b => Cues
        97#19            * SeekPosition  u[4]=40315034
      4151#20        * Info  children[size=149]
      4157#21          * TimecodeScale  u[3]=1000000
      4164#22          * MuxingApp  8[35]='libebml v1.2.1 + libmatroska v1.1.1'
      4202#23          * WritingApp  8[58]='mkvmerge v4.9.1 ('Ich will') built on Jul 11 2011 23:53:15'
      4263#24          * Duration  f[4]=388000
      4270#25          * DateUTC  d[8]=Fri Sep 23 2011 00:33:39 GMT+0200 (Paris, Madrid (heure d’été))
      4281#26          * SegmentUID  b[16]=8e9c49d7b307eb148bd386041b43d6ca
```

# COMPLETE parsing

Complete parsing of a mkv:
```js
var matroska = require('matroska');

var url="http://download.wavetlan.com/SVV/Media/HTTP/mkv/H264_mp3(mkvmerge).mkv";

var decoder = new matroska.Decoder();
decoder.parse(url, function(error, document) {
	if (error) {
		console.error(error);
		return;
	}

	console.log(document.print());
});

```

Returns: 
```
         0#0     * Document  [FileSource file=G:\Downloads\H264_mp3(mkvmerge).mkv]
         0#1       * EBML  children[size=40]
         5#2         * EBMLVersion  u[1]=1
         9#3         * EBMLReadVersion  u[1]=1
        13#4         * EBMLMaxIDLength  u[1]=4
        17#5         * EBMLMaxSizeLength  u[1]=8
        21#6         * DocType  s[8]='matroska'
        32#7         * DocTypeVersion  u[1]=2
        36#8         * DocTypeReadVersion  u[1]=2
        40#9       * Segment  children[size=3661175]
        52#10        * SeekHead  children[size=51]
        57#11          * Seek  children[size=15]
        60#12            * SeekID  b[4]=1549a966 => Info
        67#13            * SeekPosition  u[2]=4099  [=>#21]
        72#14          * Seek  children[size=15]
        75#15            * SeekID  b[4]=1654ae6b => Tracks
        82#16            * SeekPosition  u[2]=4248  [=>#28]
        87#17          * Seek  children[size=16]
        90#18            * SeekID  b[4]=1c53bb6b => Cues
        97#19            * SeekPosition  u[3]=3660935  [=>#2109]
       103#20        * Void  b[4045]
      4151#21        * Info  children[size=149]
      4157#22          * TimecodeScale  u[3]=1000000
      4164#23          * MuxingApp  8[35]='libebml v1.2.1 + libmatroska v1.1.1'
      4202#24          * WritingApp  8[58]='mkvmerge v4.9.1 ('Ich will') built on Jul 11 2011 23:53:15'
      4263#25          * Duration  f[4]=69956
      4270#26          * DateUTC  d[8]=Fri Sep 23 2011 00:17:39 GMT+0200 (Paris, Madrid (heure d’été))
      4281#27          * SegmentUID  b[16]=bcb1c3b73d5109e98863c2955602b063
      4300#28        * Tracks  children[size=217]
      4306#29          * TrackEntry  children[size=142]
      4309#30            * TrackNumber  u[1]=1
      4312#31            * TrackUID  u[4]=644805295
      4319#32            * TrackType  u[1]=1
      4322#33            * FlagLacing  u[1]=0
      4325#34            * MinCache  u[1]=1
      4329#35            * CodecID  s[15]='V_MPEG4/ISO/AVC'
      4346#36            * CodecPrivate  b[43]=0142c00cffe1001c6742c00c9a740501edff807800c988000003000800000301
      4392#37            * DefaultDuration  u[4]=41666666
      4400#38            * Language  s[3]='und'
      4407#39            * Video  children[size=24]
      4409#40              * PixelWidth  u[2]=640
      4413#41              * PixelHeight  u[2]=480
      4417#42              * DisplayWidth  u[4]=640
      4424#43              * DisplayHeight  u[4]=806
      4431#44            * ContentEncodings  children[size=17]
      4434#45              * ContentEncoding  children[size=14]
      4437#46                * ContentCompression  children[size=11]
      4440#47                  * ContentCompAlgo  u[1]=3
      4444#48                  * ContentCompSettings  b[1]=00
      4448#49          * TrackEntry  children[size=69]
      4450#50            * TrackNumber  u[1]=2
      4453#51            * TrackUID  u[4]=1713889946
      4460#52            * TrackType  u[1]=2
      4463#53            * CodecID  s[9]='A_MPEG/L3'
      4474#54            * DefaultDuration  u[4]=26122448
      4482#55            * Language  s[3]='und'
      4489#56            * Audio  children[size=11]
      4491#57              * SamplingFrequency  f[4]=22050
      4497#58              * Channels  u[1]=2
      4500#59            * ContentEncodings  children[size=17]
      4503#60              * ContentEncoding  children[size=14]
      4506#61                * ContentCompression  children[size=11]
      4509#62                  * ContentCompAlgo  u[1]=3
      4513#63                  * ContentCompSettings  b[1]=ff
      4517#64        * Void  b[1108]
      5628#65        * Cluster  children[size=290112]
      5635#66          * Timecode  u[1]=0
      5638#67          * SimpleBlock  b[1439]
      7080#68          * SimpleBlock  b[4184]
     11267#69          * SimpleBlock  b[134]
     11404#70          * SimpleBlock  b[19]
     11425#71          * SimpleBlock  b[308]
     ...
    288918#206         * SimpleBlock  b[1573]
    290494#207         * SimpleBlock  b[5243]
    295740#208       * Cluster  children[size=246364]
    295747#209         * Timecode  u[2]=4875
    295751#210         * SimpleBlock  b[2613]
      ...
   3397072#1958        * SimpleBlock  b[2136]
   3399211#1959      * Cluster  children[size=259667]
   3399218#1960        * Timecode  u[2]=64833
   3399222#1961        * SimpleBlock  b[3913]
      ...
   3657216#2101        * SimpleBlock  b[148]
   3657367#2102        * SimpleBlock  b[1268]
   3658638#2103        * BlockGroup  children[size=240]
   3658641#2104          * Block  b[231]
   3658875#2105          * ReferenceBlock  i[1]=-42
   3658878#2106      * Cluster  children[size=2109]
   3658884#2107        * Timecode  u[3]=69851
   3658889#2108        * SimpleBlock  b[2095]
   3660987#2109      * Cues  children[size=228]
   3660993#2110        * CuePoint  children[size=14]
   3660995#2111          * CueTime  u[1]=0
   3660998#2112          * CueTrackPositions  children[size=9]
   3661000#2113            * CueTrack  u[1]=1
   3661003#2114            * CueClusterPosition  u[2]=5576  [=>#65]
   3661007#2115        * CuePoint  children[size=16]
   3661009#2116          * CueTime  u[2]=4875
   3661013#2117          * CueTrackPositions  children[size=10]
   3661015#2118            * CueTrack  u[1]=1
   3661018#2119            * CueClusterPosition  u[3]=295688  [=>#208]
   ...
   3661199#2175        * CuePoint  children[size=16]
   3661201#2176          * CueTime  u[2]=64833
   3661205#2177          * CueTrackPositions  children[size=10]
   3661207#2178            * CueTrack  u[1]=1
   3661210#2179            * CueClusterPosition  u[3]=3399159  [=>#1959]

```

# Edition of MKV

... it works, samples soon :-)