MKV文件解析实例

本文详细介绍了Matroska多媒体容器格式的内部结构,包括EBML头、Segment、Tracks、Cluster等关键元素及其子元素的具体定义和作用。通过本文,读者可以了解如何解析Matroska文件,以及其支持的特性,例如即时定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EBML头//
   1A 45 DF A3 A3

// EBMLVersion EBML编码器版本号
   42 86     // ID
   81         // 长度
   01        // 值
// EBMLReadVersion EBML解析器版本号
   42 F7    // ID
   81        // 长度
   01         // 值
// EBMLMaxIDLength EBML元素ID号的最长长度(多少字节),在MATROSKA文件中最长为4字节
   42 F2    // ID
   81        // 长度
   01        // 值    
// EBMLMAXSizeLength EBML元素最长长度(多少字节)
   42 F3     // ID
   81         // 长度
   08         // 值
// DocTypes EBML文件中的内容类型,MATROSKA文件为"matroska"            
   42 82     // ID
   88         // 长度
   6D 61 74 72 6F 73 6B 61    // 值
// DocTypeVersion EBML文件包含数据的编码器版本号            
   42 87     // ID
   81         // 长度
   02         // 值
// DocTypeReadVersion EBML文件包含数据的解析器版本号        
   42 85    // ID
   81         // 长度
   02        // 值

Segment
   18 53 80 67 01 00 00 00 00 09 3B 0F

// SeekHead 指向SEGMENT子素的索引信息,可以指向其它的SeekHead
// 如果Cluster元素中的BlockGroup和SimpleBlock子元素在其尾部,
// 那么可以不用SeekHead,不然的话,文件的帧数据地址定位将很复杂
   11 4D 9B 74     // ID
   AE         // 长度

// Seek 包含了一个Segment的子元素的ID号和它的具体位置
   4D BB                 // ID
   8C                     // 长度
// SeekID SegmentInfo的ID号
   53 AB                 // ID
   84                     // 长度
   15 49 A9 66
// SeekPosition 对应SeekID的元素的位置(相对于Segment数据首地址)
     53 AC                 // ID
   82                     // 长度
   10 03

// Seek 包含了一个Segment的子元素的ID号和它的具体位置
   4D BB                 // ID
   8C                     // 长度
// SeekID Tracks的ID号
     53 AB                 // ID
   84                     // 长度
   16 54 AE 6B
// SeekPosition 对应SeekID的元素的位置(相对于Segment数据首地址)
   53 AC                 // ID
   82                        // 长度
   10 9A         
   
// Seek 包含了一个Segment的子元素的ID号和它的具体位置
   4D BB                 // ID
   8D                        // 长度
// SeekID Cues的ID号
   53 AB                 // ID
   84                     // 长度
   1C 53 BB 6B
// SeekPosition 对应SeekID的元素的位置(相对于Segment数据首地址)
   53 AC                 // ID
   83                     // 长度
   09 3A 8D
   
//??
EC
4F CD

// EBMLVOID 预留空间

// SegmentInfo 包括了SEGMENT元素的信息,如UID,标题等
15 49 A9 66         // ID
40 91                     // 长度
// TimecodeScale 每个时间码都通过和此值相乘来得到具体时间(微秒单位),但不是 所有的时间码都这样
2A D7 B1                // ID
83                             // 长度
0F 42 40                 
// MuxingApp 生成此文件的库名称,如”libMatroska-0.7.0”,在发生问题时可以参考
4D 80                     // ID
A3                            // 长度
6C 69 62 65 62 6D 6C 20 76 31 2E 32 2E 33 20 2B
20 6C 69 62 6D 61 74 72 6F 73 6B 61 20 76 31 2E
33 2E 30
// WritingApp 生成此文件的程序名称,如”mkvmerge 0.8.1”
57 41                     // ID
BC                             // 长度
6D 6B 76 6D 65 72 67 65 20 76 35 2E 36 2E 30 20
28 27 4B 65 6E 79 61 20 4B 61 6E 65 27 29 20 62
75 69 6C 74 20 6F 6E 20 4D 61 79 20 32 37 20 32
30 31 32 20 31 36 3A 34 34 3A 30 34
// Duration 此Segment的总回放时间,将其乘以TimecodeScale来得出具体时间(微秒单位)
44 89                     // ID
84                             // 长度
47 22 80 00
// DateUTC 生成此文件的时间,从2001.01.01 0:00:00 GMT+0h开始计算
44 61
88
05 28 37 EF 41 E0 5C 00
// SegmentUID 表示Segment的128位ID号,可以被其它的文件引用
73 A4                     // ID
90                             // 长度
A2 A7 C8 0F 28 7D 58 B7 83 90 BF 25 9A E2 07 9D


// Tracks 描述了包含在Cluster中的数据轨道信息,可以在文件生成多个备份。
// 如果没有Cluster元素,Tracks元素也可以不存在。
16 54 AE 6B            // ID
FA                            // 长度

// TrackEntry
AE
F8
// TrackNumber 轨道的序列号,不可以为0,将被Cluster的子元素Block和SimpleBlock使用
D7
81
01
// TrackUID 轨道的ID号,不可以为0
73 C5
84
A9 67 83 84
// TrackType 轨道的类型,如视频,音频,字幕
83
81
01
// FlagLacing 是否包括了捆绑数据块(表示在一个数据块中包含多帧 lacing block)
9C
81
00
// MinCache 在播放时必须提供多少帧的缓存区,比如当MPEG4帧以其编码顺序来播放时使用
6D E7
81
01
// CodecID 轨道使用的编码类型ID
86
8F
56 5F 4D 50 45 47 34 2F 49 53 4F 2F 41 56 43
// DefaultDuration 表示一帧持续了多少微秒。
// 当没有Duration元素或使用捆绑(lacing)方式时将使用此值。
// 如果值为0表示此轨道的帧的持续时间不定。(如Vorbis 音频)。
// 使用此值将使文件的定位非常容易。
23 E3 83
84
05 F5 E1 00
// Language 轨道使用的语言,和Name所用语言无关
22 B5 9C
83
75 6E 64

// Master Video 视频轨道视频相关信息
E0
96
B0 82 01 60 BA 82 01 20 54 B0 84 00 00 01 60 54
BA 84 00 00 01 20
// Master ContextEncodings 轨道的压缩或加密信息
6D 80
8E
// Master ContentEncoding 描述轨道使用的压缩或加密信息
62 40
8B
// Master ContentCompression 具体压缩信息
50 34
88
// ContentCompAlgo 描述压缩算法
42 54
81
03
// ContentCompSettings 压缩配置信息
42 55
81
00
// CodecPrivate 解压时所需要的数据。如Vorbis编码的初始化数据包
63 A2
98
01 42 E0 14 FF E1 00 08 67 42 E0 14 DA 05 82 51
01 00 05 68 CE 30 A4 80

// ??
EC
44 0F

// 预留空间

// Master Cluster 包括了视频,音频,字幕数据。
// 因为MATROSKA文件提供了Charpter和Attachment子元素来表示其它的数据内容,所以可以没有Cluster元素
1F 43 B6 75
20 7E 87

// TimeCode 用来做所包含的Block的开始时间码
E7
81
00

// SimpleBlock 只包含一个数据块,没有附加信息,所以资源浪费会小很多,SimpleBlock由Matroska V2提供
A3
46 33
81 00 00 80
...(数据)

// Cues 包含了Cluster数据帧的时间戳,用来支持即时定位
1C 53 BB 6B     // ID
FD                         //长度

// Master CuePoint Track的定位信息
BB                         // ID
8C                         // 长度
// CueTime 在某Cluster的Block的时间码
B3                         // ID
81                         // 长度
00
// Master CueTrackPositions Cluster和Block的定位信息
B7                         // ID
87                         // 长度
F7 81 01 F1 82 15 2B

// Master CuePoint Track的定位信息
BB                         // ID
8D                         // 长度
// CueTime 在某Cluster的Block的时间码
B3
82
0A 28
// Master CueTrackPositions Cluster和Block的定位信息
B7
87
F7 81 01 F1 82 93 B9

// Master CuePoint Track的定位信息
BB
8E
// CueTime 在某Cluster的Block的时间码
B3
82
21 98
// Master CueTrackPositions Cluster和Block的定位信息
B7
88
F7 81 01 F1 83 01 F0 32

// Master CuePoint Track的定位信息
BB
8E
// CueTime 在某Cluster的Block的时间码
B3
82
39 08
// Master CueTrackPositions Cluster和Block的定位信息
B7
88
F7 81 01 F1 83 03 5A 29

BB
8E

B3
82
50 78
// Master CueTrackPositions Cluster和Block的定位信息
B7
88
F7 81 01 F1 83 04 BA D0

BB
8E

B3
82
67 E8
// Master CueTrackPositions Cluster和Block的定位信息
B7
88
F7 81 01 F1 83 05 C7 3D

BB
8E

B3
82
7F 58
// Master CueTrackPositions Cluster和Block的定位信息
B7
88
F7 81 01 F1 83 07 1A 26

BB
8E

B3
82
96 C8

// Master CueTrackPositions Cluster和Block的定位信息.
B7
88
// CueTrack Track的序号,等于TrackEntry元素的TrackNumber.
F7
81
01
// CueClusterPosition Cluster相对于Segment元素数据的相对地址
F1
83
08 76 F2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值