Matroska封装格式非常灵活、兼容性好,既适用于本地文件存储又可以进行实时流传输。本篇文章主要探讨Matroska的编解码器映射,如何封装视频流、音频流、字幕流。如果要Matroska的介绍、功能和基本结构,请查看上一篇文章:走进音视频的世界——Matroska封装格式的介绍(一)。
一、Matroska流
Matroska有两种传输流:文件访问(存储)和实时流传输(直播)。
1. 文件存储
Matroska是一种容器,支持把多媒体流封装成为文件,存储于本地。Matroska的开销很小,非常适合将音乐/视频存储在文件服务器上,而对使用的带宽没有很大影响。Matroska不需要在播放之前加载索引,因此可以非常快速地开始播放。只有在第一次请求搜索时才能加载索引。
2. 直播
实时流媒体相当于互联网上的电视广播。有2种服务器用于实时流传输:RTP / RTSP和HTTP。Matroska不能在RTP上使用。RTP已经具有定时和通道机制,如果在Matroska中加倍,则会浪费时间。此外,如果RTP和Matroska级别的信息不匹配,则可能会造成混淆。可以通过HTTP(或任何其他基于TCP的普通协议)对Matroska进行实时流传输。
实时Matroska流与文件不同,因为它通常没有已知的结尾(仅在客户端断开连接时才结束)。为此,Segment Element 必须将“大小”部分的所有位都设置为1。另一种选择是Segment Element与已知大小连接,一个接一个。该解决方案允许在每个段之间更改编解码器/分辨率。例如,这允许在电视节目中在4:3和16:9之间切换。如果流既无MetaSeek列表或Cues在流的开始列表,它应该被视为非可查找。即使可以在信息流中盲目向前搜索,也不建议这样做。
二、编解码器映射
Codec Mapping(编解码器映射)是一组属性,用于识别,命名和上下文化可以包含在Matroska群集中的编码数据的格式和特征。Matroska中使用的每个TrackEntry都必须引用定义,并且Codec Mapping使用 Codec ID来标识和描述其关联簇中编码数据的格式。Codec ID是一个唯一的注册标识符,代表存储在Track中的编码。某些编码可能还需要某种形式的编解码器初始化,以便为其解码器提供上下文和技术元数据。
1. 编解码器ID
每个支持在Matroska中存储的编解码器都必须具有唯一的Codec ID。根据编解码器的相关类型,每个表Codec ID 必须以下表中的字符串为前缀。Codec ID Prefix的所有字符必须是大写字母(AZ)除的最后一个字符Codec ID Prefix,其必须为下划线(“_”)。编解码器类型与ID前缀对应关系如下表所示:
| 编解码器类型 | 编解码器ID前缀 |
|---|---|
| 视频 | “ V_” |
| 声音的 | “A_” |
| 字幕 | “ S_” |
| 按钮 | “ B_” |
每个Codec ID必须在Major Codec ID后面紧跟一个Codec ID Prefix。而Major Codec ID可能跟一个可选的Codec ID Suffix通信的一个改进Major Codec ID。如果使用a Codec ID Suffix,则Codec ID必须在Major Codec ID和和之间使用正斜杠(“ /”)作为分隔符Codec ID Suffix。在Major Codec ID必须只由大写字母(AZ)和数字(0-9)的。在Codec ID Suffix必须只由大写字母(AZ),数字(0-9),下划线(“_”)和斜杠(“/”)的。Codec IDs及其组成部分如下表所示:
| 编解码器ID前缀 | 主要编解码器ID | 分隔器 | 编解码器ID后缀 | 编解码器ID |
|---|---|---|---|---|
| A_ | AAC | / | MPEG2 / LC / SBR | A_AAC / MPEG2 / LC / SBR |
| V_ | MPEG4 | / | ISO / ASP | V_MPEG4 / ISO / ASP |
2. 初始化
在Matroska中存储的每种编码都必须具有定义的初始化。而且初始化必须描述初始化解码器所需的数据存储,该数据必须存储在中CodecPrivate Element。当初始化在轨道中更新时,必须将更新后的初始化数据写入CodecState Element要求在第一个Cluster的初始化数据中。如果编码不需要任何形式的初始化,则none必须被用来定义的初始化和CodecPrivate Element不应该被写入和必须被忽略。被定义为要存储在中的初始化数据CodecPrivate Element称为Private Data。
3. 编解码器块添加
Block可以将上下文关联或补充a的其他数据存储在BlockAdditional Elementa的内BlockMore Element。该BlockAdditional数据可以与的内容一起传递给相关的解码器Block Element。每一个BlockAdditional都带有一个BlockAddID,用于标识其包含的数据类型。<

本文深入探讨了Matroska封装格式的两种传输流——文件存储和实时流传输,重点讲解了编解码器映射,包括编解码器ID、初始化、BlockAdditional数据等。同时,详细列举了视频、音频和字幕的编解码器映射示例,如V_MPEG4/ISO/ASP、A_AAC/MPEG2/MAIN和S_TEXT/UTF8等。此外,还介绍了如何在Matroska中添加元信息标签,如电影和音频标签,以及字幕存储规范。

3万+

被折叠的 条评论
为什么被折叠?



