大多数浏览器和
Developer App 均支持流媒体播放。
-
使用AVFoundation在APP上输出HDR影像
探索如何利用 AVFoundation 在 app 内创作并输出高动态范围(HDR)内容。了解高动态范围以及如何在 app 内对其进行巧妙运用。我们将会向你展示如何运用特征集来让人们输出HDR内容,转化支持的 HDR 各式,审核流量限制,并且探索支持 HDR 输出的 Apple 平台。
资源
相关视频
WWDC21
-
下载
(你好 2020 全球开发者大会) 你好 欢迎来到全球开发者大会 (使用AVFoundation 在APP上输出HDR影像) 大家好 我是松村凯文 接下来我会讲解如何通过简单的几步操作 在输出视频中 保留高动态范围(HDR) 在本次视频中 我们将学习一些基本要点 涉及多个方面如什么是HDR视频 在输出中支持哪些HDR格式 通过AVAssetExportSession 输出HDR视频内容的简单方法 在输出HDR时 AVAssetWriter提供的额外灵活性 最后提一下哪些Apple平台支持HDR输出 好 下面我们开始吧 HDR扩展了视频的动态范围 远远超过 标准动态范围(SDR)视频的动态范围 它通过大幅度提高亮度值范围来实现扩展
SDR视频的峰值亮度是每平方米100坎德拉 通常也称为尼特 而HDR视频的峰值亮度 则可以达到10,000尼特 比前者大两个数量级
因此 HDR视频 在显示方面就是白色更亮 黑色更暗 此外 HDR有着更出色的对比度 阴影部分有更多细节 高光部分更突出 从技术方面来讲 这就是HDR的全部含义 不过 HDR通常间接地和广色域放在一起 色域和动态范围 加在一起就是指色彩容量 或者说可描述色彩的总数
为涵盖更大的亮度和颜色范围 HDR通常也会 和更高的比特深度联系在一起 对于媒体发行来说 常见的是10-bit HDR最重要的是转换函数 转换函数描述了场景线性光如何映射至 非线性信号值 然后再映射至显示光 这整个过程的目的就是 保留原场景的艺术意图 一直到到终端用户的显示
光电转换函数或OETFs 属于编码或捕捉端 是从场景光映射至信号值 电光转换函数或EOTFs 属于解码或显示端 是从信号值映射回显示光 需要注意的是 EOTF并不一定刚好是OETF的对立面
HDR引入了两个全新的转换函数 混合对数伽码或HLG转换函数 目的是向后兼容SDR 这意味着HLG内容可以在SDR显示屏上显示 但超过100尼特的像素会被剪裁
HLG是以场景为参考的系统 也就是说 编码信号值和标准化的场景光有关 感知量化或PQ转换函数 是基于人类视觉系统的工作方式设计的 特别是对比敏感度 你们熟悉的一些PQ HDR格式 可能包括杜比视界和HDR10 虽然 一个HDR转换函数足以将视频归类为HDR 但有些HDR格式在输出的比特流中 加入了额外信息 这些额外数据… 我们称之为HDR元数据 可以更好地将编码信号值映射回显示光 并被EOTF在解码器中用于说明 母盘显示环境和当前显示环境的不同 HDR元数据的内容一般可分为 流数据、场景数据或帧数据
HLG就是一种没有元数据的HDR格式 有些格式会添加一些静态元数据 这类元数据在整个影片中保持不变 HDR10就属于这类情况 此外 有些格式会添加动态元数据 这类数据根据场景不同而改变 甚至每个视频帧对应不同的元数据 杜比视界正是采取这种方式 注意 动态元数据和 静态元数据也可一起应用 之前我提到过 HDR经常和广色域联系在一起 该图说明了色域的差异 这里的第一个三角形 代表了BT.709和sRGB两种色彩空间 它们最初是 为标准清晰度广播电视行业设计的 下面这个大点的三角形代表了P3色彩空间 是Digital Cinema Initiatives 为电影行业创造的 与BT.709相比 P3可以描述更细微的色彩 最后并且也是最大的三角形代表BT.2020 它涵盖更多的色彩 BT.2020是为超高清电视开发的标准 广色域与HDR转换函数和10-bit格式一起 打造更明亮、代表原场景的视频 现在我们对HDR有了一个大概的了解 那么我们来看下哪些HDR格式支持输出 AVFoundation 通过HLG和HDR10格式支持HDR 这些不仅是行业标准 也被消费级显示屏广泛支持 这非常重要 因为我们想要你的用户可以 充分利用HDR的所有优点 包括显示
因此 不管你的用户是否 通过原生支持HDR的Apple设备 来查看你的内容… (输出支持的HDR格式 HLG和HDR10) …比如iPhone、iPad、MacBook或者iMac 或者通过外部HDR显示器或TV来显示 输出视频在用户那里都以HDR格式呈现 注意 Apple早在2017年 已经为我们的专业用户 提供了HDR输出支持 特别是 通过Final Cut Pro X和Compressor 今年我们会给你们 也就是开发者们带来HDR输出支持 尽管目前HDR视频内容 仅限于高端摄像机 但我们认为HDR内容在未来会变得更普遍 并想帮你备好所需工具 以便你能充分利用这种趋势 接下来我们谈一下你们大多数将会接触的 主要输出界面 那就是AVAssetExportSession AVAssetExportSession 是最常用的一种输出界面 它假定了文件转码的工作流程 (通过AVASSETEXPORTSESSIONS进行输出 典型工作流程) 通过它 你可以在共享用例中直接输出单个资源 或者通过AVComposition 在时间上将多个轨道区段合并 从而进行一些编辑 或者在输出前 使用AVVideoComposition进行空间合成
AVAssetExportSession 是为了使输出更简单而设计 AVAssetExportSession基于预设 这些预设定义了输出的编码参数 AVAssetExportSession 会为你们处理剩下的工作 如必要 它会执行色彩空间转换 缩小和帧率转换等的操作。 (AVASSETEXPORTSESSION基础知识) 为更简单的输出而打造 AVAssetExportSession 为H.264、HEVC和Apple ProRes编解码 提供预设 有些预设符合特定的最高视频清晰度 而也有一定数量的预设 考虑到不同视频质量等级的选择 这里有个代码片段说明了 AVAssetExportSession的易用性 首先使用源文件资源和预设创建输出部分 这里我选取了 HEVCHighestQuality这一预设 然后你们指定 作为URL的输出文件名和输出文件类型 就是这样 简单来说 这就是你们开始输出所需要做的全部 那么使用 AVAssetExportSession输出HDR视频 你们需要更改哪些设置呢 你们肯定会喜欢这个问题的答案 如果你使用的是HEVC或Apple ProRes预设 那什么设置都不需要更改 我们更新了现有的HEVC预设 用于保留源文件的HDR格式
例如 HDR10源文件资源将输出为HDR10 HLG输出后还是HLG 当然 SDR源文件资源输出后还是SDR
Apple ProRes预设 也将保留源文件的HDR格式
为从HDR转换为SDR 我们建议使用H.264预设 因为它会最大程度向后兼容 合成 不管是时间还是空间合成 在合成动态范围格式时都需要额外的处理 试想一下 我们有一份混合了HDR和SDR的内容
AVAssetExportSession 会检测展示给它的所有源文件资源 搜索HDR内容 找到HDR内容后 输出文件会是HDR 合成中的任何SDR资源会转换为HDR
假如不同的HDR格式混合在一起 输出的默认规则 是首选HLG而不是PQ格式 注意 AVAssetExportSession知道 如何在PQ和HLG格式之间进行恰当转换
如需进一步完善 输出时会首选包含元数据的 HDR格式而不是没有元数据的格式 我刚刚所说的输出合成规则 可以通过一个表格更生动地展示 第一行第一列显示HDR优先于SDR 第二行第二列显示HLG优先于PQ 这个表格背后的逻辑 可以延伸到任何数量的源文件资源 我们希望AVAssetExportSession 能够满足许多开发者的需求 但我们深知它并不适用于所有人 这时我们就需要AVAssetWriter 这是两个常见的 AVAssetWriter工作流程
第一个工作流程采用 来自AVAssetReader的阅读样本 它们通过AVComposition和/或 AVVideoComposition有选择地编辑 然后由AVAssetWriter输出
第二个工作流程描述了一个app 这个app 使用AVAssetWriter输出相机捕捉的帧 通过AVAssetWriter 你可以完全掌控输出过程 你可以明确指定视频编解码器 想使用的比特率、输出视频的帧率 视频帧的精确尺寸 色彩空间以及动态范围 对于有多个视频编码器的Mac来说 你甚至可以指定 使用哪个视频编码器进行输出
注意 这绝对不包括所有可以指定的参数 但你可以大概了解 一些想要配置的常见参数 AVAssetWriter提供了许多管理方法 接下来我将介绍简化配置过程的两种方法 这个代码片段视频表明了 AVAssetWriter最简单的调用方法 首先你要通过 输出URL和文件类型创建AssetWriter 然后需要提供outputSettings字典 通过它管理输出的方方面面 不过 这里我们使用的是 AVAssetWriterInput界面 在源文件 videoFormatDescription的表格中 可以接受sourceFormatHint 这种情况下 outputSettings唯一需要的键 就是视频编解码类型 AVAssetWriter会基于hint中 提供的 source videoFormatDescription 为剩下的参数构建合理的默认值 下面这个代码片段说明了 如何通过AVOutputSettingsAssistant 配置AVAssetWriter AVOutputSettingsAssistant 提供了预设可供选择 类似于AVAssetExportSession 这些预设提供了 一个模板字典 可直接使用 或者作为 AVAssetWriterInput配置的起点
这里我选取了hevc-1920x1080尺寸预设 我们也强烈建议在检索videoSettings前 为设置助手 提供源文件的videoFormatDescription 通过提供sourceVideoFormat AVOutputSettingsAssistant 可将源文件特征 与预设设置 和非常类似于AVAssetExportSession 配置相似输出时的返回设置合并 这些设置 很有可能对你们来说足够用了 你可以不做任何更改 将他们用于AVAssetWriterInput 但是你们也有机会更改设置 比如更改输出视频的尺寸 或者更改视频比特率 接下来我们讨论下 AVAssetWriterInput outputSettings字典中 与HDR相关的不同的键 在处理HDR进行配置时 你们需要关注以下三个键 视频编解码器 色彩属性及压缩属性键 下面我们来了解每个键的详细内容
AVVideoCodecKey键 AVFoundation通过两种编解码器 支持HDR:HEVC 和 Apple ProRes HEVC是一种非常常见的HDR发行格式 HEVC有着出色的压缩效率 所以输出的文件大小很容易管理 Apple ProRes 是专业视频工作流程使用的交换格式 AVVideoColorPropertiesKey键 是有三种键的字典 转换函数、基本色和YCbCrMatrix 转换函数 我们已经讲过了 HLG和PQ是两种支持的HDR转换函数
ColorPrimariesKey键 专为广色域格式设定 BT.2020对于HDR内容来说很常见
YCbCrMatrixKey键说明如何 在YUV和RGB色彩表达之间进行转换 BT.2020非恒定亮度系统专门为HDR设计
AVVideoCompressionPropertiesKey 键是一个字典 这个字典包含了 你们想要在输出设置中更改的大多数键 不过 当中唯一相关的HDR键 是VideoProfileLevelKey键 在使用HEVC编解码器输出HDR时 它必须设置为HEVC_Main10_AutoLevel 注意 不支持8-bit的HEVC HDR 而且这个键也不适用于ProRes输出
好 现在我们来总结下 在输出两种常见HDR格式时 如何对我刚提到的那些键进行配置 这两种格式就是HLG和HDR10 该表格显示了 输出HLG文件时的相关HDR设置 对于编解码器的设置 你必须选择HEVC或者Apple ProRes 你可为基本色和YCbCrMatrix指定任何值 不过它们的典型设置是ITU_R_2020 转换函数很明显必须设置为HLG 因为我们需要的是HLG文件 假如你选择了HEVC编解码器 你也需要指定 ProfileLevel为HEVC_Main10_AutoLevel 现在我们 来解决更为复杂的HDR10 和之前一样 选HEVC或Apple ProRes作为编解码器类型 传统来说 虽然HDR10基于HEVC 我们也会使用HDR10定义指定了 MasteringDisplayColorVolume和 ContentLightLevelInfoProRes的 ProRes资源 关于这点 过会儿再讲 正如在HLG情况下 ColorPrimaries和Matrix 一向设置为ITU_R_2020 而转换函数必须设置为PQ 再一次将ProfileLevel 设置为HEVC_Main10_AutoLeve 然后进行HEVC HDR10的输出
最后 对于HDR10来讲 我们建议同时指定两个可选键 接下来介绍下详细内容 母盘显示色彩容量或者MDCV 描述了母盘内容的显示 内容光等级信息或者CLLI 提供关于影片总体光等级的信息
最好是两者的值都指定好 这样解码器的EOTF 可以更准确地进行HDR处理 如果没有设置 解码器的EOTF会被迫为其假定一个默认值 这样的话可能会违背你的意图 MDCV和CLLI SEI信息格式 在该引用的ISO规范中进行了定义 现在我想简单提一下 哪些Apple平台支持HDR输出 iOS在配备Apple A10 Fusion芯片 或者更新芯片的设备上 支持HEVC硬件编码 幸运地是 A10设备上市已经有段时间了 可以追随到2018年推出的iPhone 7和iPad 以及2019年的iPod touch
关于Mac HEVC和Apple ProRes 软件编码器都能在Mac上使用 HEVC硬件编码一般 在运行新macOS系统的 2017年和更新版本的Mac上可以使用 硬件编码可以大幅提升输出速度 好 是时候要结束了 我们简单学习了什么是HDR 它如何保留原场景艺术意图 一直到终端用户的显示 通过提高动态范围 HDR可以创建白色更亮、黑色更暗 以及阴影部分和高光部分细节更多的视频 鉴于HDR视频的所有这些优点 你们需要确保确保自己的app会在 输出时保留明亮的、色彩鲜艳的HDR内容 操作很简单 像任何其他输出一样 你可以使用AVAssetExportSession 或者AVAssetWriter来实现 选择HEVC或者 Apple ProRes编解码器或预设
使用AVAssetWriter时 不要忘了将转换函数设为HLG或者PQ 明确地将视频profile level 设置为HEVC_Main10_AutoLevel 之后再进行HEVC HDR的输出 最后 使用广色域 最好是ITU_R_2020 这里是关于HDR的一些额外参考 注意 同本视频一起的还有一个视频 介绍如何使用 AVFoundation进行HDR编辑和回放 (接下来的操作 HDR视频简介) (HDR元数据) 感谢各位观看我的演示 希望你喜欢 2020 全球开发者大会的其他部分 (2020 全球开发者大会) (你好) (2020 全球开发者大会)
-
-
9:02 - AVAssetExportSession Intro
// AVAssetExportSession code snippet guard let exportSession = AVAssetExportSession(asset: sourceAsset, presetName: AVAssetExportPresetHEVCHighestQuality) else { // Handle error } exportSession.outputURL = outputURL exportSession.outputFileType = AVFileTypeQuickTimeMovie exportSession.exportAsynchronouslyWithCompletionHandler { // Handle completion }
-
13:24 - AVAssetWriter with sourceFormatHint
// AVAssetWriter with sourceFormatHint let assetWriter = try AVAssetWriter(url: outputURL, fileType: AVFileTypeQuickTimeMovie) let outputSettings: [String: AnyObject] = [ AVVideoCodecKey: AVVideoCodecTypeHEVC ] let assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: outputSettings sourceFormatHint: videoFormatDescription) assetWriter.add(assetWriterInput) guard assetWriter.startWriting() else { throw assetWriter.error! }
-
14:13 - AVAssetWriter with AVOutputSettingsAssistant
// AVAssetWriter with AVOutputSettingsAssistant let assetWriter = try AVAssetWriter(url: outputURL, fileType: AVFileTypeQuickTimeMovie) let settingsAssistant = AVOutputSettingsAssistant( preset: AVOutputSettingsPreset.hevc1920x1080) settingsAssistant.sourceVideoFormat = videoFormatDescription let newVideoSettings = settingsAssistant.videoSettings // Modify a few fields in newVideoSettings here let assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: newVideoSettings) assetWriter.add(assetWriterInput) guard assetWriter.startWriting() else { throw assetWriter.error! }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。