走进音视频的世界——Matroska封装格式的介绍(二)

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

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,用于标识其包含的数据类型。<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐福记456

您的鼓励和肯定是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值