MATROSKA文件格式之Segments学习

来源:互联网 发布:mac inode没有en4 编辑:程序博客网 时间:2024/06/05 18:46


http://blog.csdn.net/yu_yuan_1314/article/details/9142803


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

0 0
原创粉丝点击