常见媒体类型中的编解码器
从根本上讲,您可以使用简单的 MIME 类型(例如 video/mp4
或 audio/mpeg
)来指定媒体文件的类型。但是,许多媒体类型(尤其是那些支持视频轨道的媒体类型)可以从更精确地描述其内部数据格式的能力中受益。例如,仅使用 MIME 类型 video/mp4
描述 MPEG-4 文件中的视频,并没有说明实际媒体的格式。
因此,可以将 codecs
参数添加到描述媒体内容的 MIME 类型中。使用它,可以提供特定于容器的信息。这些信息可能包括视频编解码器的配置文件、用于音频轨道的类型等等。
本指南简要介绍了媒体类型 codecs
参数的语法以及它如何与 MIME 类型字符串一起使用,以提供有关音频或视频媒体内容的详细信息,而不仅仅是指示容器类型。
容器格式 MIME 类型
容器格式的 MIME 类型通过说明媒体类型(audio
、video
等)、然后是一个斜杠字符(/
)、然后是用于包含媒体的格式来表示
audio/mpeg
-
使用 MPEG 文件类型的音频文件,例如 MP3。
video/ogg
-
使用 Ogg 文件类型的视频文件。
video/mp4
-
使用 MPEG-4 文件类型的视频文件。
video/quicktime
-
Apple 的 QuickTime 格式的视频文件。如其他地方所述,此格式曾经在 Web 上广泛使用,但现在已不再使用,因为它需要插件才能使用。
但是,所有这些 MIME 类型都比较模糊。所有这些文件类型都支持各种编解码器,而这些编解码器可能具有任意数量的配置文件、级别和其他配置因素。因此,您可能希望将 codecs
参数与媒体类型一起包含。
基本语法
您可以将 codecs
参数添加到媒体类型中。为此,请附加一个分号(;
),后跟 codecs=
,然后是描述文件内容格式的字符串。某些媒体类型仅允许您指定要使用的编解码器的名称,而其他媒体类型则允许您指定这些编解码器的各种约束。您可以通过逗号分隔多个编解码器来指定它们。
与任何 MIME 类型参数一样,如果编解码器的任何属性使用必须根据 RFC 2231,第 4 节:MIME 参数值和编码词扩展进行百分比编码的特殊字符,则必须将 codecs
更改为 codecs*
(注意星号字符 *
)。您可以使用 JavaScript encodeURI()
函数对参数列表进行编码;类似地,您可以使用 decodeURI()
解码先前编码的参数列表。
注意:当使用 codecs
参数时,指定的编解码器列表必须包含文件中使用的每个编解码器。该列表还可以包含文件中不存在的编解码器。
按容器划分的编解码器选项
AV1
AV1 的 codecs
参数的语法在 AV1 编解码器 ISO 媒体文件格式绑定规范的第 5 节:编解码器参数字符串中定义。
av01.P.LLT.DD[.M.CCC.cp.tc.mc.F]
注意:基于 Chromium 的浏览器将接受可选参数的任何子集(而不是像规范要求的那样全部或无)。
此编解码器参数字符串的组件在下面的表格中进行了更详细的描述。每个组件都是固定数量的字符;如果值小于该长度,则必须用前导零填充。
组件 | 详细信息 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P |
一位配置文件编号
|
||||||||||||||||||||
LL |
两位级别编号,转换为 X.Y 格式级别格式,其中 X = 2 + (LL >> 2) 且 Y = LL & 3 。有关详细信息,请参阅 AV1 规范中的 附录 A,第 3 节。 |
||||||||||||||||||||
T |
一位层指示符。对于主要层(seq_tier 等于 0),此字符为字母 M 。对于高级层(seq_tier 为 1),此字符为字母 H 。高级层仅适用于 4.0 及以上级别。 |
||||||||||||||||||||
DD |
两位组件比特深度。此值必须为 8、10 或 12 之一;哪些值有效取决于配置文件和其他属性。 | ||||||||||||||||||||
M |
一位单色标志;如果此值为 0,则视频除 Y 平面外还包括 U 和 V 平面。否则,视频数据完全位于 Y 平面中,因此是单色的。有关 YUV 颜色系统的工作原理的详细信息,请参阅 YUV。默认值为 0(非单色)。 | ||||||||||||||||||||
CCC |
默认值为 |
||||||||||||||||||||
cp |
两位 color_primaries 值表示媒体使用的颜色系统。例如,用于 HDR 视频的 BT.2020/BT.2100 颜色为 09 。此信息(以及每个剩余组件的信息)位于 AV1 规范的 颜色配置语义部分。默认值为 01 (ITU-R BT.709)。 |
||||||||||||||||||||
tc |
两位 transfer_characteristics 值。此值定义用于将伽马(在技术术语中称为“光电传递函数”)从源映射到显示器的函数。例如,10 位 BT.2020 为 14 。默认值为 01 (ITU-R BT.709)。 |
||||||||||||||||||||
mc |
两位 matrix_coefficients 常量选择用于将红、蓝和绿通道转换为亮度和色度信号的矩阵系数。例如,用于 BT.709 的标准系数使用值 01 表示。默认值为 01 (ITU-R BT.709)。 |
||||||||||||||||||||
F |
一个一位数的标志,指示颜色是否应该允许使用全部可能的取值范围 (1 ),或者应该限制在被认为对指定颜色配置有效的取值范围内(即,**工作室摆动表示**)。默认为 0(使用工作室摆动表示)。 |
从 M
(单色标志)开始的所有字段都是可选的;您可以在任何时候停止包含字段(但不能任意省略字段)。默认值包含在上表中。一些 AV1 编解码器字符串示例
av01.2.15M.10.0.100.09.16.09.0
-
AV1 专业配置文件,级别 5.3,主层级,每个颜色分量 10 位,使用 ITU-R BT.2100 颜色原色、传输特性和 YCbCr 颜色矩阵的 4:2:2 色度子采样。指示工作室摆动表示。
av01.0.15M.10
-
AV1 主配置文件,级别 5.3,主层级,每个颜色分量 10 位。其余属性取自默认值:4:2:0 色度子采样、BT.709 颜色原色、传输特性和矩阵系数。工作室摆动表示。
VP9
ISO 基本媒体文件格式语法
VP9 的 codecs
参数的语法在 VP 编解码器 ISO 媒体文件格式绑定 规范的 编解码器参数字符串 部分中定义。
在此格式中,codecs
参数的值以一个四字符代码开头,用于识别容器中使用的编解码器,然后是一系列用句点 (.
) 分隔的两位数值。
cccc.PP.LL.DD cccc.PP.LL.DD.CC.cp.tc.mc.FF
前四个组件是必需的;从 CC
(色度子采样)开始的所有内容都是可选的,但必须全部或不选。这些组件中的每一个都在下表中进行了描述。表格后面是一些示例。
组件 | 详细信息 | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
cccc |
一个四字符代码,指示哪个可能的编解码器正在被描述。潜在值是
|
||||||||||||||||||||||||||||||||||
PP |
两位数的配置文件编号,如果需要,用前导零填充以确保正好两位数。
|
||||||||||||||||||||||||||||||||||
LL |
两位数的级别编号。级别编号采用定点表示法,其中第一位是各位数字,第二位表示十分位。例如,级别 3 是 30 ,级别 6.1 是 61 。 |
||||||||||||||||||||||||||||||||||
DD |
亮度和颜色分量值的位深度;允许的值为 8、10 和 12。 | ||||||||||||||||||||||||||||||||||
CC |
一个两位数的值,指示要使用的色度子采样格式。下表列出了允许的值;有关此主题和其他主题的更多信息,请参阅我们“数字视频概念”指南中的 色度子采样。
|
||||||||||||||||||||||||||||||||||
cp |
一个两位数的整数,指定 ISO/IEC 23001-8:2016 标准第 8.1 节中的颜色原色中的哪一个。此组件以及之后的每个组件都是可选的。 颜色原色组件的可能值为
|
||||||||||||||||||||||||||||||||||
tc |
一个两位数的整数,指示视频的 transferCharacteristics 。此值来自 ISO/IEC 23001-8:2016 的第 8.2 节,并指示在将解码后的颜色适配到渲染目标时要使用的传输特性。 |
||||||||||||||||||||||||||||||||||
mc |
matrixCoefficients 属性的两位数的值。此值来自 ISO/IEC 23001-8:2016 规范第 8.3 节中的表格。此值指示在从本机红、蓝和绿原色映射到亮度和色度信号时要使用哪组系数。这些系数反过来与该部分中找到的方程一起使用。 |
||||||||||||||||||||||||||||||||||
FF |
指示是否将每个颜色分量的黑电平和颜色范围限制在合法范围内。对于 8 位颜色样本,合法范围是 16-235。值为 00 表示应强制执行这些限制,而值为 01 则允许每个分量的全部可能的取值范围,即使结果颜色超出颜色系统的范围。 |
示例
video/webm;codecs="vp09.02.10.10.01.09.16.09.01,opus"
-
VP9 视频,配置文件 2 级别 1.0,具有使用 4:2:0 色度子采样、BT.2020 原色、ST 2084 EOTF(HDR SMPTE)、BT.2020 非恒定亮度颜色矩阵和全范围色度和亮度编码的 10 位 YUV 内容。音频采用 Opus 格式。
ISO 基本媒体文件格式:MP4、QuickTime 和 3GP
基于 ISO 基本媒体文件格式 (ISO BMFF) 的所有媒体类型都共享相同的 codecs
参数语法。这些媒体类型包括 MPEG-4(实际上,MPEG-4 所基于的 QuickTime 文件格式)以及 3GP。可以使用以下 MIME 类型使用 codecs
参数描述视频和音频轨道
MIME 类型 | 描述 |
---|---|
audio/3gpp |
3GP 音频 (RFC 3839:第 3 代合作伙伴计划 (3GP) 多媒体文件的 MIME 类型注册) |
video/3gpp |
3GP 视频 (RFC 3839:第 3 代合作伙伴计划 (3GP) 多媒体文件的 MIME 类型注册) |
audio/3gp2 |
3GP2 音频 (RFC 4393:3GPP2 多媒体文件的 MIME 类型注册) |
video/3gp2 |
3GP2 视频 (RFC 4393:3GPP2 多媒体文件的 MIME 类型注册) |
audio/mp4 |
MP4 音频 (RFC 4337:MPEG-4 的 MIME 类型注册) |
video/mp4 |
MP4 视频 (RFC 4337:MPEG-4 的 MIME 类型注册) |
application/mp4 |
封装在 MPEG-4 中的非视听媒体 |
由 codecs
参数描述的每个编解码器都可以指定为容器的名称(3gp
、mp4
、quicktime
等)或容器名称加上其他参数以指定编解码器及其配置。编解码器列表中的每个条目可以包含一些组件,用句点 (.
) 分隔。
codecs
值的语法因编解码器而异;但是,它始终以编解码器的四字符标识符、句点分隔符 (.
) 开头,后跟特定数据格式的对象类型指示 (OTI) 值。对于大多数编解码器,OTI 是一个两位数的十六进制数;但是,对于 AVC (H.264),它是六位十六进制数字。
因此,每个支持的编解码器的语法如下所示
cccc[.pp]*
(通用 ISO BMFF)-
其中
cccc
是编解码器的四字符 ID,pp
是零个或多个两位数编码的属性值所在的位置。 mp4a.oo[.A]
(MPEG-4 音频)-
其中
oo
是更精确地描述媒体内容的对象类型指示值,A
是一位数的音频 OTI。OTI 的可能值可以在 MP4 注册机构网站的 对象类型页面 上找到。例如,MP4 文件中的 Opus 音频为mp4a.ad
。有关更多详细信息,请参阅 MPEG-4 音频。 mp4v.oo[.V]
(MPEG-4 视频)-
在这里,
oo
再次是更精确地描述内容的 OTI,而V
是一位数的视频 OTI。 avc1[.PPCCLL]
(AVC 视频)-
PPCCLL
是六位十六进制数字,指定配置文件编号 (PP
)、约束集标志 (CC
) 和级别 (LL
)。有关PP
的可能值,请参阅 AVC 配置文件。约束集标志字节由一位布尔标志组成,最高有效位称为标志 0(或某些资源中的
constraint_set0_flag
),每个后续位编号都高一位。目前,仅使用标志 0 到 2;其他五位必须为零。标志的含义取决于使用的配置文件。级别是一个定点数,因此值为
14
(十进制 20)表示级别 2.0,而值为3D
(十进制 61)表示级别 6.1。一般来说,级别编号越高,流使用的带宽就越多,支持的最大视频尺寸也越高。
AVC 配置文件
以下是 AVC 配置文件及其在 codecs
参数中使用的配置文件编号,以及约束组件 CC
的指定值。
配置文件 | 编号(十六进制) | 约束字节 |
---|---|---|
**受约束的基线配置文件 (CBP)** CBP 主要是针对资源受限或需要控制资源使用以最大程度降低媒体性能不佳的可能性的场景的解决方案。 | 42 |
40 |
**基线配置文件 (BP)** 与 CBP 类似,但具有更多数据丢失保护和恢复功能。这不像 CBP 引入之前那样广泛使用。所有 CBP 流也被视为 BP 流。 | 42 |
00 |
**扩展配置文件 (XP)** 旨在通过网络流式传输视频,具有高压缩能力以及对数据鲁棒性和流切换的进一步改进。 | 58 |
00 |
**主配置文件 (MP)** 用于以 MPEG-4 格式广播的标准清晰度数字电视的配置文件。不用于高清电视广播。自 2004 年为 HDTV 使用添加了高级配置文件以来,该配置文件的重要性已经下降。 | 4D |
00 |
**高级配置文件 (HiP)** 目前,HiP 是广播和基于磁盘的 HD 视频的主要配置文件;它用于 HD 电视广播和蓝光视频。 | 64 |
00 |
高级渐进编码(PHiP) 本质上是高级编码,但不支持字段编码。 | 64 |
08 |
受限高级编码 PHiP,但不支持双向预测切片(“B 切片”)。 | 64 |
0C |
高级 10 编码(Hi10P) 高级编码,但支持每个颜色分量最多 10 位。 | 6E |
00 |
高级 4:2:2 编码(Hi422P) 在 Hi10P 的基础上扩展,增加了对 4:2:2 色度下采样的支持,以及每个颜色分量最多 10 位。 | 7A |
00 |
高级 4:4:4 预测编码(Hi444PP) 除了 Hi422P 中包含的功能外,Hi444PP 还增加了对 4:4:4 色度下采样的支持(其中不丢弃任何颜色信息)。还包括对每个颜色样本最多 14 位的支持以及高效的无损区域编码。可以选择将每个帧编码为三个独立的颜色平面(也就是说,每个颜色的数据都存储为单色帧)。 | F4 |
00 |
高级 10 内部编码 高级编码,限制为全帧内使用。主要用于专业应用。 | 6E |
10 |
高级 4:2:2 内部编码 Hi422 编码,限制为全帧内使用。 | 7A |
10 |
高级 4:4:4 内部编码 高级 4:4:4 编码,限制为仅使用帧内帧。 | F4 |
10 |
CAVLC 4:4:4 内部编码 高级 4:4:4 编码,限制为全帧内使用,并且仅使用 CAVLC 熵编码。 | 44 |
00 |
可扩展基线编码 旨在用于视频会议以及监控和移动用途,SVC 基线编码基于 AVC 的受限基线编码。流中的基层以高质量提供,还有一些次级子流提供了相同视频的替代形式,可在各种受限环境中使用。这些可能包括任何组合的降低分辨率、降低帧率或提高压缩级别。 | 53 |
00 |
可扩展受限基线编码 主要用于实时通信应用。WebRTC 尚未支持,但 WebRTC API 的扩展 以允许 SVC 正在开发中。 | 53 |
04 |
可扩展高级编码 主要用于广播和流媒体应用。基层(或最高质量层)必须符合 AVC 高级编码。 | 56 |
00 |
可扩展受限高级编码 可扩展高级编码的一个子集,主要设计用于实时通信。 | 56 |
04 |
可扩展高级内部编码 主要仅对生产应用有用,此编码仅支持全帧内使用。 | 56 |
20 |
立体高级编码 立体高级编码使用场景的两个渲染(左眼和右眼)提供立体视频。否则,提供与高级编码相同的功能。 | 80 |
00 |
多视图高级编码 支持使用时间和 MVC 视图间预测的两个或多个视图。不支持字段图像或宏块自适应帧场编码。 | 76 |
00 |
多视图深度高级编码 基于高级编码,主子流必须遵守该编码。其余子流必须与立体高级编码匹配。 | 8A |
00 |
MPEG-4 音频
当 codecs
列表中条目的值以 mp4a
开头时,该值的语法应为
mp4a.oo[.A]
此处,oo
是两位十六进制对象类型指示,它指定用于媒体的编解码器类。OTI 由 MP4 注册机构 分配,该机构维护着 可能的 OTI 值列表。一个特殊的值是 40
;这表示媒体为 MPEG-4 音频(ISO/IEC 14496 第 3 部分)。为了更具体,对于 OTI 40
,添加了第三个组件——音频对象类型,以将类型缩小到 MPEG-4 的特定子类型。
音频对象类型指定为一位或两位十进制值(与 codecs
参数中的大多数其他值不同,后者使用十六进制)。例如,MPEG-4 的 AAC-LC 的音频对象类型号为 2
,因此表示 AAC-LC 的完整 codecs
值为 mp4a.40.2
。
因此,ER AAC LC(其音频对象类型为 17)可以使用完整 codecs
值 mp4a.40.17
表示。一位值可以作为一位给出(这是最佳选择,因为兼容性最广),也可以用前导零将其填充到两位,例如 mp4a.40.02
。
注意:规范最初规定第三个组件中的音频对象类型号只能是一位十进制数字。但是,随着时间的推移,规范的修订将这些值的范围扩展到远远超过一位十进制数字,因此现在第三个参数可以是一位或两位数字。用前导 0
填充小于 10 的值是可选的。但是,旧版本的 MPEG-4 编解码器可能不支持两位值,因此在可能的情况下使用一位数字将最大程度地提高兼容性。
音频对象类型在 ISO/IEC 14496-3 第 1 部分第 1.5.1 节中定义。下表提供了音频对象类型的基本列表,并且在更常见对象类型的情况下,提供了支持它的配置文件列表,但如果您需要了解任何给定 MPEG-4 音频类型的内部工作原理的更多信息,则应参考规范。
ID | 音频对象类型 | 配置文件支持 |
---|---|---|
0 |
NULL | |
1 |
AAC 主 | 主 |
2 |
AAC LC(低复杂度) | 主、可扩展、HQ、LD v2、AAC、HE-AAC、HE-AAC v2 |
3 |
AAC SSR(可扩展采样率) | 主 |
4 |
AAC LTP(长期预测) | 主、可扩展、HQ |
5 |
SBR(频谱带复制) | HE-AAC、HE-AAC v2 |
6 |
AAC 可扩展 | 主、可扩展、HQ |
7 |
TwinVQ(超低比特率编码) | 主、可扩展 |
8 |
CELP(码激励线性预测) | 主、可扩展、语音、HQ、LD |
9 |
HVXC(谐波矢量激励编码) | 主、可扩展、语音、LD |
10 – 11 |
保留 | |
12 |
TTSI(文本到语音接口) | 主、可扩展、语音、合成、LD |
13 |
主合成 | 主、合成 |
14 |
波表合成 | |
15 |
通用 MIDI | |
16 |
算法合成和音频效果 | |
17 |
ER AAC LC(抗误差 AAC 低复杂度) | HQ、移动互联 |
18 |
保留 | |
19 |
ER AAC LTP(抗误差 AAC 长期预测) | HQ |
20 |
ER AAC 可扩展(抗误差 AAC 可扩展) | 移动互联 |
21 |
ER TwinVQ(抗误差 TwinVQ) | 移动互联 |
22 |
ER BSAC(抗误差位切片算术编码) | 移动互联 |
23 |
ER AAC LD(抗误差 AAC 低延迟;用于双向通信) | LD、移动互联 |
24 |
ER CELP(抗误差码激励线性预测) | HQ、LD |
25 |
ER HVXC(抗误差谐波矢量激励编码) | LD |
26 |
ER HILN(抗误差谐波和单个线加噪声) | |
27 |
ER 参数化(抗误差参数化) | |
28 |
SSC(正弦编码) | |
29 |
PS(参数立体声) | HE-AAC v2 |
30 |
MPEG 环绕声 | |
31 |
转义 | |
32 |
MPEG-1 第 1 层 | |
33 |
MPEG-1 第 2 层(MP2) | |
34 |
MPEG-1 第 3 层(MP3) | |
35 |
DST(直接流传输) | |
36 |
ALS(音频无损) | |
37 |
SLS(可扩展无损) | |
38 |
SLS 非核心(可扩展无损非核心) | |
39 |
ER AAC ELD(抗误差 AAC 增强低延迟) | |
40 |
SMR 简单(符号音乐表示简单) | |
41 |
SMR 主(符号音乐表示主) | |
42 |
保留 | |
43 |
SAOC(空间音频对象编码) |
|
44 |
LD MPEG 环绕声(低延迟 MPEG 环绕声) |
|
45 及以上 |
保留 |
WebM
WebM codecs
参数的基本形式是列出四个 WebM 编解码器中的一个或多个,并用逗号分隔。下表显示了一些示例
MIME 类型 | 描述 |
---|---|
video/webm;codecs="vp8" |
包含 VP8 视频的 WebM 视频;未指定音频。 |
video/webm;codecs="vp9" |
包含 VP9 视频的 WebM 视频。 |
audio/webm;codecs="vorbis" |
WebM 容器中的 Vorbis 音频。 |
audio/webm;codecs="opus" |
WebM 容器中的 Opus 音频。 |
video/webm;codecs="vp8,vorbis" |
包含 VP8 视频和 Vorbis 音频的 WebM 容器。 |
video/webm;codecs="vp9,opus" |
包含 VP9 视频和 Opus 音频的 WebM 容器。 |
字符串 vp8.0
和 vp9.0
也有效,但不建议使用。
使用 codecs 参数
您可以在几种情况下使用 codecs
参数。首先,您可以在创建 <audio>
或 <video>
元素时,将其与 <source>
元素一起使用,以便为浏览器建立一组选项,以便在选择要呈现给元素中用户的媒体格式时进行选择。
您还可以在将 MIME 媒体类型指定给 MediaSource.isTypeSupported()
方法时使用 codecs 参数;此方法返回一个布尔值,指示媒体是否可能在当前设备上工作。