17_Apple 设备的 HTTP 实时流式处理 (HLS) 创作规范附录

概述

本文中的附录扩展了 Apple 设备的 HTTP 实时流式处理 (HLS) 创作规范中提供的信息。它不打算作为独立文档。

测试我们的流

Apple 在 https://developer.apple.com/download/all 时为 HTTP Live Streaming 提供了几个命令行工具。使用 Apple 开发人员帐户登录后,搜索 http 实时流式传输工具。

若要帮助验证流,请使用命令行工具 mediastreamvalidator 和 hlsreport。虽然这些工具无法检查有关我们的流的所有内容,但它们所做的检查相当全面,Apple 会继续改进这些工具。

通过目视检查检查流的视频质量。媒体流验证器工具不检查视频质量,因此请检查在各种网络条件下的流播放。

使用 hlsreport

使用二进制 hlsreport 从媒体流验证器创建的 JSON 文件生成 HTML 摘要报告。该报告包括几个表格,其中包含有关变体、格式副本和 I 帧变体的详细信息。每个表条目都有一个唯一的流 ID 号。包括问题列表,根据此规范分为“必须修复”和“应修复”类别。这些问题使用唯一的流 ID 交叉引用各个变体和演绎版。

注意

HLS 工具的早期版本使用名为 hlsreport.py 的脚本,而不是二进制文件。

最简单的调用方法是:

HLSREPORT validation_data.json

其中validation_data.json是mediastreamvalidator生成的JSON文件。这将生成一个名为 validation_data.html 的文件,该文件是报表。我们可以使用 -o 选项更改报告文件的名称:

hlsreport -o my_report.html validation_data.json

有关更多信息,请参见 hlsreport(1) 手册页。

声明值与测量值的带宽

VOD 比特率是针对整个内容测量的。实时(线性)比特率是在 ~1 小时的内容中测量的。

VOD LIVE/Linear
测量的平均比特率与平均带宽(属性) 属性值的 10% 以内 <属性值的 110%
测量的峰值比特率与带宽(属性) 属性值的 10% 以内 <属性值的 125%
测量的峰值比特率与测量的平均比特率 <测量平均值的 200% 无规则

音频兼容性

有关设备和音频格式兼容性的其他信息。

注意

多通道输出取决于实际输出设备的能力。

设备 AAC(立体声) AC-3/E-AC-3 杜比数字增强版与杜比全景声
iOS 设备 - 基于 A12 仿生及更高版本 Yes Yes Yes
Apple TV 4K(第 1 代和第 2 代)† Yes Yes Yes
OS X 设备 - 2018 及更高版本 yes Yes Yes
iOS 和 tvOS 设备 - 基于 A7 或更高版本 *,但未在上面列出 Yes Yes 作为E-AC-3播放
较旧的 OS X 设备 Yes Yes 作为E-AC-3播放
Apple TV(第 3 代)、iPhone 5 和 iPhone 5C Yes 仅AC-3 No
所有较旧的 iOS 和 tvOS 设备 Yes No No

注意

上表中的所有设备都支持 AAC(立体声)。

有关实际技术规格,请参阅 https://support.apple.com/specs/。

*完整支持需要 iOS 9.3 或 tvOS 9.2 或更高版本。配备杜比全景声的杜比数字增强版需要 tvOS 12.0 或更高版本。

采用杜比全景声†的杜比数字增强版需要 tvOS 12.0 或更高版本。

关于变体的比特率

许多因素会影响对视频进行编码所需的比特率:

这些因素使得内容的通用编码建议变得困难。适用于 Apple 设备的 HTTP 实时流式处理 (HLS) 创作规范包括初始比特率建议,我们可以根据内容、约束和编码工作流程评估这些建议。

I 帧比特率与正常比特率

Apple 设备的 HTTP 实时流式处理 (HLS) 创作规范中的第 6.5 项(针对 I 帧比特率)中的公式需要一些解释。

在特技播放过程中,玩家尝试每秒提供八帧。如果播放速率意味着更高的帧速率,则将丢弃帧以将帧速率保持在每秒 8 帧。如果可用帧较少,它将以较低的帧速率播放。

I 帧比特率是以正常速度播放时再现的比特率。I 帧呈现形式可以是 2 fps、1 fps、0.5 fps、0.2 fps 或其他内容。设 F 为 I 帧呈现形式的帧速率。然后,8/F 是乘数,即以每秒 8 帧的速度播放演绎版提高了多少比特率。比特率的增加不会超过此系数,因为播放器每秒播放的帧数不能超过 8 帧。

I 帧呈现形式应具有与正常内容类似的有效比特率。因此,正常比特率除以乘数应该是 I 帧的比特率。除以分数与乘以其倒数相同,因此结果为 6.5 — 相同分辨率的正常播放列表的比特率乘以 I 帧播放列表的 fps 除以 8。

I 帧图像序列

添加了使用 mjpg 编解码器的 I 帧图像序列以支持某些第三方设备。序列应为低带宽,并且需要最少的处理。与图像序列相比,玩家应该更喜欢视频 I 帧变体。

对图像序列的建议如下:

音频呈现形式组和变体

在建立多变量播放列表时,第一步是选择视频分辨率和编解码器。这些是我们的基本变体。每个都将有一个视频媒体播放列表。播放列表 URI 可以在多个 EXT-X-STREAM-INF 标签中重复,以便同一视频可以与不同的音频内容相关联。

我们将拥有一些音频语言和编解码器。特定的编解码器可以是立体声、5.1 声音或两者兼而有之。为每对编解码器和通道数创建一个音频组。每个小组都需要包含每种语言。

制作音频组时,需要记住一些事项。首先,确保我们有一个立体声 AAC 组。这是一个很好的回退,因为它是所有设备都可以播放的内容。如果我们在无损音频编解码器中具有多声道,则最好也使用多声道 AAC 编解码器。无损需要高比特率。我们想要具有较低比特率的可用产品。在播放过程中,我们不想切换通道数。如果播放是多声道的,则希望保持多声道。

一般来说,播放器不会在音频编解码器之间切换,但有两个值得注意的例外。它将在AAC变体之间切换:AAC-LC,HE-AAC,HE-AACv2和USAC(也称为xHE-AAC)。我们还将在无损编解码器和 AAC 编解码器之间切换。

拥有音频组后,我们可以复制每个组的变体条目,但有一些例外。如果编解码器是可切换的(如 AAC 编解码器),则可以使用具有低视频比特率的低音频比特率组和具有高视频的高音频比特率组将音频组分布到变体中。但是,如果编解码器不可切换,例如 AC-3 和无损,则我们希望每个编解码器与每个变体相关联。这不会创建新的变体播放列表;它只是在多变量播放列表中创建新的 EXT-X-STREAM-INF 标签,这些标签将视频播放列表与音频组相关联。

我们可能会遇到一个问题,即没有选择我们想要支持的变体。默认行为是在当前可播放的内容中选择最高的比特率。对于 USAC 和杜比数字 Plus,这可能会导致反转,即所选变体不是我们想要的。为了解决这个问题,苹果添加了SCORE属性。该值是一个浮点数。我们必须将其放在所有变体上。如果要设置订单,则必须完成,否则将遇到无法选择的情况。通常的过滤发生在一组变体中,其中任何一个都可以播放。此时,系统使用 SCORE 来决定,最高分数获胜。

CODECS 属性的值

使用 EXT-X-STREAM-INF 标签(和 EXT-X-I-FRAME-STREAM-INF)的 CODECS 属性指定媒体样本类型。该值是一个带引号的字符串,其中包含以逗号分隔的格式列表,其中每种格式指定播放列表的媒体片段或标记引用的某个格式副本的媒体片段中存在的媒体样本类型。

有效的格式标识符是 RFC 6381 定义的 ISO 基本媒体文件格式命名空间中的标识符。格式标识符是由句点分隔的元素序列。第一个元素是基本样本类型。HLS 目前可识别基本样本类型的以下值:

基础样品类型 描述 笔记
ac-3 AC-3 audio
alac Apple Lossless
avc1 H.264 (Advanced Video Coding)
avc3 H.264 (Advanced Video Coding) 不推荐使用
dvh1 Dolby Vision (based on hvc1)
dvhe Dolby Vision (based on hev1) 不推荐使用
ec-3 Enhanced AC-3 audio
fLaC Free Lossless Audio Codec
hev1 HEVC (High-Efficiency Video Coding) 不推荐使用
hvc1 HEVC (High-Efficiency Video Coding)
mjpg JPEG image sequence 限制使用
mp4a MPEG-4 audio
stpp Subtitles (Timed Text)
wvtt WebVTT data

注意

HLS识别“avc3”,“dvhe”和“hev1”,但Apple不建议使用它们。

MP4 注册机构 (mp4ra.org) 列出了带有 JOC(杜比全景声)的增强型 AC-3 音频的值 ec+3。HLS 不使用该值。相反,它使用 ec-3 并在音频呈现形式的 CHANNEL 属性中使用 JOC 标记其他 JOC 内容的存在。JOC必须大写。例如,CHANNELS=“16/JOC”。数值应与杜比数字增强音轨的 EC3SpecificBox 中complexity_index_type_a字段的值匹配。

样品类型 描述
ac-3 AC-3 audio
alac Apple Lossless audio
avc1.42001f H.264 Baseline Profile, Level 3.1 video
avc1.4d0028 H.264 Main Profile, Level 4.0 video
avc1.640029 H.264 High Profile, Level 4.1 video
dvh1.05.01 Dolby Vision Profile 5 (10-bit HEVC), Level 1 (720p24) video
dvh1.05.06 Dolby Vision Profile 5 (10-bit HEVC), Level 6 (2160p24) video
ec-3 Enhanced AC-3 audio
fLaC Free Lossless Audio Codec audio
hvc1.1.4.L126.B0 HEVC Main Profile, Main Tier, Level 4.2 video
hvc1.2.4.L123.B0 HEVC Main 10 Profile, Main Tier, Level 4.1 video
hvc1.2.4.L150.B0 HEVC Main 10 Profile, Main Tier, Level 5.0 video
mjpg JPEG image sequence
mp4a.40.2 AAC-LC audio
mp4a.40.5 HE-AAC audio
mp4a.40.29 HE-AACv2 audio
mp4a.40.34 MP3 audio
mp4a.40.42 xHE-AAC audio
stpp.ttml.im1t IMSC1 text-only subtitles
wvtt WebVTT subtitles

FairPlay流的ALLOWED-CPC值

ALLOWED-CPC 属性将加密变体流的播放限制为保证一定级别的内容保护可靠性的设备。该属性将内容保护配置 (CPC) 标签列表与特定的 KEYFORMAT 值相关联。

FairPlay允许的CPC标签是:

CPC标签 符合该 CPC 标签的设备
AppleBaseline 任何支持 FairPlay 流媒体的 Apple 平台
AppleMain 任何支持 FairPlay 串流并保证增强的内容保护稳健性的 Apple 平台(足以用于工作室 4K/HDR 播放)
Baseline 任何支持 FairPlay 流媒体的非 Apple 平台。例如,任何支持 AirPlay 2 的智能电视。
Main 任何支持 FairPlay 流媒体并保证增强的内容保护稳健性(足以用于工作室 4K/HDR 播放)的非 Apple 平台

有效属性的一个示例是:ALLOWED-CPC=“com.apple.streamingkeydelivery:AppleMain/Main”

SUPPLEMENTAL-CODECS属性

某些编解码器与其他编解码器向后兼容。这些编解码器的工作原理是添加元数据,这些元数据在被解释为兼容编解码器时被忽略,但由较新的编解码器使用。这些编解码器包括杜比视界 8.4(与 HLG 兼容)和杜比视界 8.1(与 HDR10 兼容)。

为了在较旧的实现上支持这些编解码器,CODECS 属性用于描述基础层。增强的编解码器在“补充-编解码器”属性中进行了描述。这允许支持 SUPPLEMENTAL-CODECS 的实现利用真正的编解码器。

“补充-CODECS”属性中的每个元素都是一个以斜杠分隔的字段列表。第一个字段必须是有效的 CODECS 格式。如果存在多个字段,则其余字段必须是与该编解码器的比特流相关的兼容品牌。

示例编解码器值:

编解码器 编解码器属性 补充属性 视频范围属性
Dolby Vision 8.4 hvc1.2.4.L153.b0 dvh1.08.07/db4h HLG
Dolby Vision 8.1 hvc1.2.4.L150 dvh1.08.06/db1p PQ

请注意,对于杜比视界,兼容性品牌和 VIDEO-RANGE 属性充当交叉检查。省略任何一个都是不正确的。

昏暗闪烁的灯光

“暗淡闪烁的灯光”是一种设置(请参阅辅助功能中的新增功能),它允许用户指示他们希望避免视频中明亮、频繁的闪光。作为一项附加措施,内容制作者可以向其 HTTP 实时流内容添加标记,以识别可能引起不适的区域。

可以使用标准 #EXT-X-DATERANGE 标记对区域发出信号。CLASS 属性应设置为“com.apple.accessibility.video.strobing.general-flash”。添加额外的 X 风险级别属性。风险级别应为 0 到 100 范围内的十进制浮点值,其中 0 表示最小风险,100 表示风险很大。

若要避免使用大量区域,请将风险级别值限制为一小组值。对风险非常低的区域使用零风险级别。除非已分析区域,否则不要使用风险级别标记区域。原始风险值可以使用诸如VideoFlashingReduction之类的算法来计算。

AVPlayerItemMetadataCollector 类可以在应用程序中用于获取 #EXT-X-DATERANGE 标记元数据。

如果我们使用 AVKit 框架,则会为我们获取元数据,并且时间线会用红色标记。如果我们显示自己的时间线,则应执行类似操作。

其他立体声视频规范

视频扩展用法原子 ('vexu') 是一个示例说明扩展,用于传达有关立体视图的可扩展信息。有关更多信息,请参阅 ISO 基本媒体文件格式和 Apple HEVC 立体声视频。

我们可以将字幕或字幕的视差元数据作为 ISOBMFF(ISO 基本媒体文件格式)或 QuickTime 文件中的时标元数据轨道提供。“mebx”原子或框描述定时元数据轨道中的样本。国际标准 ISO/IEC 14496-12:2022(“信息技术 — 视听对象的编码 — 第 12 部分:ISO 基本媒体文件格式”)将此框称为 BoxedMetadataSampleEntry(有关更多信息,请参阅该文档的第 12.9 节多路复用定时元数据轨道)。QuickTime 文件格式规范将“mebx”原子称为时标元数据示例说明(请参阅时标元数据媒体)。“mebx”原子及其内容是一个通用结构。

若要详细了解字幕视差信息中“mebx”的具体用法,请参阅 ISO 基本媒体文件格式和 QuickTime 影片文件格式中的 Apple HEVC 立体声视频和视频轮廓贴图有效负载元数据。

有关对 MV-HEVC 视频进行编码的更多信息,请参阅 Apple HEVC 立体声视频。

我们还可以在 AVFoundation 概述中找到列出的这些资源。

播放列表事例

以下是包含杜比视界、HDR10 和 SDR 内容的播放列表示例,分辨率从 720p 到 4K。

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2778321,BANDWIDTH=3971374,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1280x720,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=NONE
sdr_720/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6759875,BANDWIDTH=10022043,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1920x1080,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-0
sdr_1080/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=20985770,BANDWIDTH=28058971,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L150.B0",RESOLUTION=3840x2160,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-1
sdr_2160/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3385450,BANDWIDTH=5327059,VIDEO-RANGE=PQ,CODECS="dvh1.05.01",RESOLUTION=1280x720,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=NONE
dolby_720/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7999361,BANDWIDTH=12876596,VIDEO-RANGE=PQ,CODECS="dvh1.05.03",RESOLUTION=1920x1080,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-0
dolby_1080/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=24975091,BANDWIDTH=30041698,VIDEO-RANGE=PQ,CODECS="dvh1.05.06",RESOLUTION=3840x2160,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-1
dolby_2160/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3320040,BANDWIDTH=5280654,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1280x720,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=NONE
hdr10_720/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7964551,BANDWIDTH=12886714,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1920x1080,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-0
hdr10_1080/prog_index.m3u8
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=24833402,BANDWIDTH=29983769,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L150.B0",RESOLUTION=3840x2160,FRAME-RATE=23.976,CLOSED-CAPTIONS=NONE,HDCP-LEVEL=TYPE-1
hdr10_2160/prog_index.m3u8
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=248586,BANDWIDTH=593626,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1280x720,HDCP-LEVEL=NONE,URI="sdr_720/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=399790,BANDWIDTH=956552,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1920x1080,HDCP-LEVEL=TYPE-0,URI="sdr_1080/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=826971,BANDWIDTH=1941397,VIDEO-RANGE=SDR,CODECS="hvc1.2.4.L150.B0",RESOLUTION=3840x2160,HDCP-LEVEL=TYPE-1,URI="sdr_2160/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=232253,BANDWIDTH=573073,VIDEO-RANGE=PQ,CODECS="dvh1.05.01",RESOLUTION=1280x720,HDCP-LEVEL=NONE,URI="dolby_720/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=365337,BANDWIDTH=905037,VIDEO-RANGE=PQ,CODECS="dvh1.05.03",RESOLUTION=1920x1080,HDCP-LEVEL=TYPE-0,URI="dolby_1080/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=739114,BANDWIDTH=1893236,VIDEO-RANGE=PQ,CODECS="dvh1.05.06",RESOLUTION=3840x2160,HDCP-LEVEL=TYPE-1,URI="dolby_2160/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=232511,BANDWIDTH=572673,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1280x720,HDCP-LEVEL=NONE,URI="hdr10_720/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=364552,BANDWIDTH=905053,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L123.B0",RESOLUTION=1920x1080,HDCP-LEVEL=TYPE-0,URI="hdr10_1080/iframe_index.m3u8"
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=739757,BANDWIDTH=1895477,VIDEO-RANGE=PQ,CODECS="hvc1.2.4.L150.B0",RESOLUTION=3840x2160,HDCP-LEVEL=TYPE-1,URI="hdr10_2160/iframe_index.m3u8"

HEVC 编解码器值在 ISO/IEC 14496-15 中进行了描述。简短的描述是 Codec.Profile.Flags.TierLevel.Constraint,因此在 hvc1.2.4.L123.B0 中,2 表示主 10 配置文件,L123 表示正常层,级别 4.1。

杜比视频编解码器值在 HTTP 实时流格式 v1.1 中的杜比视界流中描述。简短描述是 Codec.Profile.Level,因此在 dvh1.05.03 中,配置文件为 5,级别为 3。