Matroska是一个开放标准项目,基于EBML(Extensible Binary Meta Language 可扩展的二进制元语言),旨在成为多媒体格式容器的标准。EBML与XML结构有点类似,RFC8794有详细介绍,在将来的格式可扩展性方面具有显着的优势,可以兼容旧容器中的文件解析。

1、Matroska功能

Matroska的设计着眼于未来,它具有如下功能:

  • 在文件中快速查找
  • 章节条目
  • 完整的元数据(标签)支持
  • 可选字幕/音频/视频流
  • 模块化可扩展
  • 错误恢复能力(即使流损坏也可以恢复播放)
  • 可通过Internet和本地网络(HTTP,CIFS,FTP等)进行流传输
  • 菜单(如DVD)

2、Matroska优势

与AVI相比,Matroska容器更加灵活。AVI容器最初是由Microsoft在90年代初期引入的,被设计为一种非常灵活的A / V容器格式,用于当时的视频和音频压缩格式。但是,AVI无法支持现代音频和视频压缩格式将提供的许多更高级的功能,例如可变比特率音频编码(VBR)或可变帧速率视频编码(VFR)。尽管AVI在90年代中期/后期使用另一种称为“Open DML AVI”的标准进行了扩展,解决2GB的文件大小限制,但仍然没有适当且符合规范的方式来支持现代压缩格式例如出色的开源Ogg Vorbis音频压缩格式。而Matroska克服了所有这些限制,并且可以通过设计支持所有已知的音频和视频压缩格式。为了保证它能够适应将来的标准,它基于一个非常灵活的基础框架EBML,允许在不破坏与旧文件向后兼容性的容器格式中添加更多功能。

另外,Matroska非常适用于多音轨、多字幕,大多数电影都采用mkv封装格式进行存储。

3、Matroska使用哪些扩展名

目前Matroska支持5种扩展名的格式:mkv、mka、mk3d、mks、webm,具体如下:

  • .mkv:用于包含至少一个视频轨道(通常至少具有一个音频轨道,以及可选地具有字幕轨道)的文件。这是最常用的扩展名。
  • .mka:用于仅音频文件,可以包含任何受支持的音频压缩格式,例如MP2,MP3,Vorbis,AAC,AC3,DTS或PCM
  • .mk3d.mkv包含立体(3D)视频的特殊情况
  • .mks:用于仅包含字幕的文件
  • .webm:一般用于封装vp9视频编码、opus音频编码,为Google所推广使用

4、Matroska结构

4.1 整体结构

一个Matroska文件必须由至少一个EBML Document使用Matroska Document Type。每个EBML Document 必须包含EBML HeaderSegment。下图表示一个简单的Matroska文件,包括一个EBML Document 带有一个EBML Header,一个Segment Element和所有八个Matroska的文件 Top Level Elements。水平间距表示Matroska元素之间的父子关系,而垂直对齐方式表示文件的存储顺序:

| EBML Header |
+---------------------------+
| Segment     | SeekHead    |
|             |-------------|
|             | Info        |
|             |-------------|
|             | Tracks      |
|             |-------------|
|             | Chapters    |
|             |-------------|
|             | Cluster     |
|             |-------------|
|             | Cues        |
|             |-------------|
|             | Attachments |
|             |-------------|
|             | Tags        |
+---------------------------+

4.2 SeekHead结构

该Matroska的EBML Schema定义八个Top Level ElementsSeekHeadInfoTracks, ChaptersClusterCuesAttachments,和Tags。其中,SeekHead Element(也称为MetaSeek)包含的索引Top Level Elements 内的位置Segment。如果没有SeekHead Element,Matroska解析器将不得不搜索整个文件以查找其他所有文件Top Level Elements。SeekHead结构如下图所示:

+--------------------------------+
| SeekHead | Seek | SeekID       |
|          |      |--------------|
|          |      | SeekPosition |
+--------------------------------+

4.3 Info结构

Info Element包含用于标识整个的重要信息Segment。这包括的标题、随机生成的唯一标识符以及任何links的唯一标识符Segment Elements。如下图所示:

+-------------------------+
| Info | SegmentUID       |
|      |------------------|
|      | SegmentFilename  |
|      |------------------|
|      | PrevUID          |
|      |------------------|
|      | PrevFilename     |
|      |------------------|
|      | NextUID          |
|      |------------------|
|      | NextFilename     |
|      |------------------|
|      | SegmentFamily    |
|      |------------------|
|      | ChapterTranslate |
|      |------------------|
|      | TimestampScale   |
|      |------------------|
|      | Duration         |
|      |------------------|
|      | DateUTC          |
|      |------------------|
|      | Title            |
|      |------------------|
|      | MuxingApp        |
|      |------------------|
|      | WritingApp       |
|-------------------------|

4.4 Track结构

Tracks Element定义每个轨道的技术细节,并且可以存储姓名,号码,唯一标识符,语言,和类型的每个轨道的(音频,视频,字幕)。另外,Tracks Element可以存储有关视频轨道分辨率或音频轨道采样率的信息。将Tracks Element 必须确定所有由编解码器到指定的轨道的数据进行解码所需要的数据。但是,所需数据取决于用于轨道的编解码器。例如,Track Element用于未压缩音频的a仅要求存在音频比特率。比如AC-3之类的编解码器将要求CodecID Element所有轨道都存在,因为这是识别使用哪个编解码器解码轨道的主要方法。Track结构如下图所示:

+------------------------------------+
| Tracks | TrackEntry | TrackNumber  |
|        |            |--------------|
|        |            | TrackUID     |
|        |            |--------------|
|        |            | TrackType    |
|        |            |--------------|
|        |            | Name         |
|        |            |--------------|
|        |            | Language     |
|        |            |--------------|
|        |            | CodecID      |
|        |            |--------------|
|        |            | CodecPrivate |
|        |            |--------------|
|        |            | CodecName    |
|        |            |----------------------------------+
|        |            | Video        | FlagInterlaced    |
|        |            |              |-------------------|
|        |            |              | FieldOrder        |
|        |            |              |-------------------|
|        |            |              | StereoMode        |
|        |            |              |-------------------|
|        |            |              | AlphaMode         |
|        |            |              |-------------------|
|        |            |              | PixelWidth        |
|        |            |              |-------------------|
|        |            |              | PixelHeight       |
|        |            |              |-------------------|
|        |            |              | DisplayWidth      |
|        |            |              |-------------------|
|        |            |              | DisplayHeight     |
|        |            |              |-------------------|
|        |            |              | AspectRatioType   |
|        |            |              |-------------------|
|        |            |              | Color             |
|        |            |----------------------------------|
|        |            | Audio        | SamplingFrequency |
|        |            |              |-------------------|
|        |            |              | Channels          |
|        |            |              |-------------------|
|        |            |              | BitDepth          |
|--------------------------------------------------------|

 4.5 Chapter结构

Chapter Element列举出所有章节信息。章节是设置预定义点以跳入视频或音频的方法,如下图所示:

+-----------------------------------------+
| Chapters | Edition | EditionUID         |
|          | Entry   |--------------------|
|          |         | EditionFlagHidden  |
|          |         |--------------------|
|          |         | EditionFlagDefault |
|          |         |--------------------|
|          |         | EditionFlagOrdered |
|          |         |---------------------------------+
|          |         | ChapterAtom | ChapterUID        |
|          |         |             |-------------------|
|          |         |             | ChapterStringUID  |
|          |         |             |-------------------|
|          |         |             | ChapterTimeStart  |
|          |         |             |-------------------|
|          |         |             | ChapterTimeEnd    |
|          |         |             |-------------------|
|          |         |             | ChapterFlagHidden |
|          |         |             |-------------------------------+
|          |         |             | ChapterDisplay | ChapString   |
|          |         |             |                |--------------|
|          |         |             |                | ChapLanguage |
+------------------------------------------------------------------+

4.6 Cluster结构

Cluster Elements包含每个轨道的内容。Matroska文件 至少包含一个Cluster Element。据推荐是,每个单独的大小Cluster Element被限制为不多存储超过5秒或5兆字节。每个Cluster Element必须包含一个Timestamp Element。每个Cluster Element应该有一个或多个BlockGroupSimpleBlock Element。而BlockGroup Element可能包含一个Block数据。Cluster结构如下图所示:

+--------------------------+
| Cluster | Timestamp      |
|         |----------------|
|         | SilentTracks   |
|         |----------------|
|         | Position       |
|         |----------------|
|         | PrevSize       |
|         |----------------|
|         | SimpleBlock    |
|         |----------------|
|         | BlockGroup     |
|         |----------------|
|         | EncryptedBlock |
+--------------------------+

 4.7 Block结构

Block包含一个偏移量,当将其添加到ClusterTimestamp Element值时,会产生Block的有效时间戳。因此,时间戳在Block本身是相对Timestamp ElementCluster。而ReferenceBlockBlockGroup用于代替基本的“P帧”或”B帧”的描述。

+----------------------------------+
| Block | Portion of | Data Type   |
|       | a Block    |  - Bit Flag |
|       |--------------------------+
|       | Header     | TrackNumber |
|       |            |-------------|
|       |            | Timestamp   |
|       |            |-------------|
|       |            | Flags       |
|       |            |  - Gap      |
|       |            |  - Lacing   |
|       |            |  - Reserved |
|       |--------------------------|
|       | Optional   | FrameSize   |
|       |--------------------------|
|       | Data       | Frame       |
+----------------------------------+

4.8 Cue结构

Cues Element提供时间索引,用于定位Tracks。它与相似SeekHead Element,但是在播放文件时用于寻找特定时间。可以不使用该元素而进行查找,但是比较困难,因为Matroska Reader必须在文件中“逐个搜寻”以寻找正确的时间戳。Cues Element至少包含一个CuePoint Element。每个CuePoint Element 存储Cluster包含BlockGroupSimpleBlock Element的位置。时间戳存储在CueTime Element,而位置存储在中CueTrackPositions Element。Cues Element是灵活的,可以用于索引每个时间戳的每个单个时间戳,也可以选择对其进行索引。Cue结构如下图所示:

+-------------------------------------+
| Cues | CuePoint | CueTime           |
|      |          |-------------------|
|      |          | CueTrackPositions |
|      |------------------------------|
|      | CuePoint | CueTime           |
|      |          |-------------------|
|      |          | CueTrackPositions |
+-------------------------------------+

4.9 Attachment结构

Attachments Element用于链接文件作为附件,如图片,网页,程序,甚至可以播放的文件所需的编解码器。Attachment结构如下图所示:

+------------------------------------------------+
| Attachments | AttachedFile | FileDescription   |
|             |              |-------------------|
|             |              | FileName          |
|             |              |-------------------|
|             |              | FileMimeType      |
|             |              |-------------------|
|             |              | FileData          |
|             |              |-------------------|
|             |              | FileUID           |
|             |              |-------------------|
|             |              | FileName          |
|             |              |-------------------|
|             |              | FileReferral      |
|             |              |-------------------|
|             |              | FileUsedStartTime |
|             |              |-------------------|
|             |              | FileUsedEndTime   |
+------------------------------------------------+

4.10 Tag结构

Tags Element包含描述元数据Segment和潜在的TracksChaptersAttachments。Tags包含文件的所有额外信息:编剧,歌手,演员,导演,标题,版本,日期,风格,注释等标签。Tags结构如下图所示:

+-------------------------------------------+
| Tags | Tag | Targets   | TargetTypeValue  |
|      |     |           |------------------|
|      |     |           | TargetType       |
|      |     |           |------------------|
|      |     |           | TagTrackUID      |
|      |     |           |------------------|
|      |     |           | TagEditionUID    |
|      |     |           |------------------|
|      |     |           | TagChapterUID    |
|      |     |           |------------------|
|      |     |           | TagAttachmentUID |
|      |     |------------------------------|
|      |     | SimpleTag | TagName          |
|      |     |           |------------------|
|      |     |           | TagLanguage      |
|      |     |           |------------------|
|      |     |           | TagDefault       |
|      |     |           |------------------|
|      |     |           | TagString        |
|      |     |           |------------------|
|      |     |           | TagBinary        |
|      |     |           |------------------|
|      |     |           | SimpleTag        |
+-------------------------------------------+

参考资料:

Matroska官网:Matroska Media Container Homepage

RFC标准:rfc8794

可以到GitHub一起学习音视频https://github.com/xufuji456/FFmpegAndroid​​​​​​​

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐