概述
MATROSKA(MKV)格式仅仅包含两种Top Level Elements,即EBML Header和Segment。
EBML Header用来描述一个EBML文件,而且一个文件只包含一个EBML Header。更多的EBML Header将会被读取它的应用程序忽略掉。MKV合成器在合成多个文件时可能会出现这样的情况,即包含多个EBML Header。EBML Header包含的内容包括:编码器版本、解析器版本、文件类型等。
Segment包含多媒体数据和各个必要的Header信息。一个MKV文件可以包含多个Segment,但不提倡这样做,因为并不是所有的工具都能够正确的处理多segment。
1、Element Inside Segment
包含在Segment中的element被称为Level 1 Element。Segment包含的element如表1所示。
表1 Segment包含的elements
2、SeekHead
SeekHead包含了一个关于Segment中的Element的位置的列表,列表的每个元素被称为Seek Element。每个Seek Element由Element ID和Position组成,如表2所示。
表2 Seek Element包含的元素
在SeekHead中,没有明确的说明在该别表中包含了多少个Seek Element,因此需要一个一个进行解析并获得Seek Element的个数。比如, 标识Seek Element的EBML-ID为0X4DBB,因此,到解析出0X4DBB时,就说明出现了一个Seek Element。
3、Cluster
Cluster包括多媒体数据和时间跨度。虽然不强制坚持elements的顺序,但是最好不要在第一个BlockGroup/SimpleBlock之后出现非BlockGroup/SimpleBlock。
Cluster中的Block有两种类型:
(1)BlockGroup,这种block带有一些附加信息,比如参考数据等。
(2)SimpleBlock,这种block不带有附加信息,而且开销比较小。
Block的格式如下所示:
BLOCK {
vint TrackNumber
sint16 Timecode // relative to Cluster timecode
int8 Flags // lacing , keyframe , discardable
if ( lacing ) {
int8 frame_count − 1
if ( lacing == EBML lacing ) {
vint s i ze [0]
s vint s i ze [1 . . frame_count−2]
} el se i f (lacing == Xiph lacing ) {
int8 size [size of < leading (frame_count−1) frames> / 255 + 1]
}
}
int8 [ ] data
}
其中,lacing有三种类型:Xiph lacing、EBML lacing和Fixed lacing。Lacing 是一种技术,这种技术允许在一个block中包含多个frame数据,这样可以降低开销,而且在后面对Lacing的处理过程中可以很容易的将frame分开。通常,在Lacing中的最后一个frame的大小是不保存的,因为它可以通过block的大小、block header的大小以及其他的frame的大小推算出来。
(1)Xiph lacing:将每个frame的大小编码成八位整数的和。如果一个数值小于255,说明下一个数值是一个frame的。例如:
size = {187, 255, 255, 120, 255, 0, 60}
改Lacing包含四个frame,它们的大小分别为:187、255 + 255 + 120 = 630,、255 + 0 = 255、60。
(2)EBML Lacing:lace中的第一个frame的大小为size[0],第i个frame的大小为size[i] - size[i - 1]。
(3)Fixed Lacing:lace中的所有frame具有相同的大小,因此不需要知道lace中frame的个数就足够了。
4、Cues
Cues包含了有助于seek操作的有用信息。每个Cue包含一个CuePoint element,里面包含了时间戳和一个列表,类表的每个元素由track号和cluster position[,cluster的block号]。通常情况下,CuePoint应该仅仅只指向关键帧。每个CuePoint包含一个指向一个timecode的entry或者一个entry列表,该entry列表中有一个entry指向track。
每个CuePoint element包含两个重要的element:CueTime和CueTrackPositions。
CueTime:与CuePoint相关的Clusters或Blocks的timecode。
CueTrackPositions:在该位置能够找到与CueTime相关的Cluster或Block。
其中,CueTrackPositions包含的element如表3所示:
表3 CueTrackPositions包含的element
5、Chapters
Chapters包含了在Segment中能够找到的所有的editions和chapters。MKV文件中的Chapters是非常有用的而且处理方式也比较复杂。Chapters element包含了一个EditionEntry element,用来描述Edition。一个edition会包含一组关于chapter的定义,因此,如果有多个edition,就意味着有多组关于chapter的定义。当存在一个playlist的时候这种情况就会出现,播放完一个chapter之后播放另一个,而且在这些chapter之间会有间隙。EditionEntry包含的element如表4所示。
表4 EditionEntry包含的element
最后
以上就是单身猎豹为你收集整理的MATROSKA文件格式之Segments学习的全部内容,希望文章能够帮你解决MATROSKA文件格式之Segments学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复