这个大众号会路线图式的遍历共享音视频技能:音视频根底(完结)→音视频工具(完结)→音视频工程示例(进行中)→音视频工业实战(准备)。**重视一下成本不高,错过干货损失不小 **

苹果用 EDR 这个词是为了跟 HDR 区分开,因为 HDR 在不同的场景可能对应着不同的了解:

  • HDR 显现:更生动的显现亮色和暗色
  • HDR 格局:HDR10、Dolby Vision
  • HDR 转化函数:PQ、HLG
  • 色调映射(Tone Mapping):HDR → SDR

而 EDR(Extended Dynamic Range)是苹果推出的一套烘托管线技能,以支撑在不同的屏幕上一起正确显现 SDR 和 HDR 内容。当显现 HDR 的内容时,EDR 并不会直接将 HDR 区域变得更亮,而是识别到 HDR 内容后进步全体屏幕亮度的一起,下降非 HDR 区域的白点值,使得其看起来没有那么亮。

下图展现了 EDR 在 Pro Display XDR 显现器上的预设:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

一般台式电脑显现器的持续亮度在 350 尼特左右,有些专业显现器的会高一点,但大部分持续不了较长时间。Pro Display XDR 则能够到达 1000 尼特全屏持续亮度,峰值亮度到达 1600 尼特。这样的功能,能够供给持续的高亮度。配合高效的背光操控,出色的明暗对比规模从最亮的白一直跨越到最深的黑,可完结 1000000:1 对比度和分外逼真的 XDR 影像。

1、在 iOS 上探究 EDR

拜见:Explore EDR on iOS[1]

这个 Session 的内容包含了下面几点:

1)介绍了 EDR API 的新增特性

  • EDR API 开端支撑 iOS 和 iPadOS。
  • 12.9 英寸 iPad Pro 新增两个新特性:Reference 形式支撑 EDR 烘托;Sidecar 支撑 EDR 烘托(Sidecar 是苹果的一项技能,支撑将 iPad 作为 Mac 的扩展屏)。

其间,Reference 形式对 EDR 的支撑如下:

  • 批改 SDR 峰值亮度为 100 nits;
  • 批改 HDR 峰值亮度为 1000 nits(这样就留出了 10 倍(1000 nits / 100 nits)的 EDR headroom);
  • 支撑封闭 HDR Tone Mapping;
  • 支撑封闭环境光自适应(比方,iPhone 的 True Tone、Auto Brightness、Night Shift 等功能);
  • 支撑白点和亮度的手动校准;
  • Reference 形式支撑的最常见 5 种 HDR/SDR 视频格局如下图(不鄙人表中的格局,会运用默许形式):

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

2)回忆了 EDR 的技能方案

如下图所示,SDR 的像素浮点数表明规模为[0.0, 1.0],其间 0.0 表明黑色,1.0 表明白色。在 EDR 的像素浮点数表明中,SDR 的部分映射到[0.0, 1.0],而大于 1.0 的部分便是比 SDR 更亮的 HDR 部分。

不像其他的 HDR 格局那样,EDR 不会做 Tone Mapping 将像素值都映射到[0.0, 1.0]的规模。这就意味着在烘托时,它有一套新的机制。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

当烘托时,像素浮点值规模为[0.0, 1.0]的 SDR 内容是始终会正常烘托的。(1.0, EDR headroom]规模的 HDR 内容也是能够烘托的。可是,超越了 EDR headroom 的部分就会被丢掉。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

EDR headroom 的存在支撑了亮度更高的 HDR 内容,可是它详细是多少呢?其实,EDR headroom 是动态的,它的值受到多种因素的影响,比方:设备的显现技能、当时的显现亮度等等。

咱们通常能够运用下面这个公式大略估计 EDR headroom:

Headroom≈DisplayPeak/SDR

比方,上面提到的 Reference 形式下的 EDR headroom 便是1000 nits / 100 nits,即 10 倍。

下表中列出了部分设备的 EDR headroom:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

3)EDR 内容的读取

对于 HDR 图片文件的处理流程如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

示例代码如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

4)运用 EDR

要运用 EDR 有下面几个留意点:

  • 要运用CAMetalLayer
  • 设置wantsExtendedDynamicRangeContent为 YES;
  • 内容支撑 EDR:
    • 支撑像素缓冲区格局;
    • 支撑转化函数;
    • 运用扩展的色彩空间。

5)查询 EDR headroom

EDR headroom 的信息能够经过 NSScreen(macOS)或 UIScreen(iOS)来获取。

比方,经过 UIScreen(iOS)能够获取这些信息:

  • 色彩的动态值:
    • 当时屏幕可能的最大值;
    • 当时的最大值;
  • Reference 形式的状况;
  • Reference 形式状况改变的告诉。

示例代码如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

经过查询 EDR headroom 的信息,能够用来做自界说的 Tone Mapping 算法

6)色调映射(Tone Mapping)

假如你不想去做自己的 Tone Mapping 算法,而是想用 Apple 内置的算法,需求用到这些能力:

  • CoreAnimation 库供给了跟 EDR metadata 相关的接口;
  • 支撑多种 metadata 参数设置,包含 HDR10 和 HLG 格局;
  • 留意,内置的 Tone Mapping 算法不是全局支撑的,运用之前要检查一下。

如下图所示,在运用之前要检查当时设备是否能够支撑 EDR metadata,然后去初始化对应格局的 EDR metadata,最终将其运用到 CAMetalLayer 来烘托时,就用运用系统自带的 Tone Mapping 算法了。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

下图展现了怎么初始化不同格局的 EDR Metadata:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

下图展现了不同色彩空间格局主张的 EDR Metadata 的结构办法:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

2、根据 CoreImage、Metal、SwiftUI 展现 EDR 内容

拜见:Display EDR content with Core Image, Metal, and SwiftUI[2]

在这个 Session 中,回忆了一下 EDR 相关的概念和术语,然后展现了一个根据 Core Image 来增加 EDR 支撑的 Demo,最终提到了怎么用 CIFilter 来创立支撑 EDR 的图画去服务于相关内容的生产。

1)EDR 相关的概念和术语

EDR 相关的概念和术语,在前面的内容已经介绍过了,这儿就不再赘述了。

不过,这儿提到了能够获取到 EDR 图画内容的几种途径,能够了解一下:

  • 运用 TIFF、OpenEXR 等支撑浮点数存储像素值的图画格局来获取 EDR 图画;
  • 经过 AVFoundation 从 HDR 的视频中截帧取得 EDR 图画;
  • 运用 Metal API 能够将 EDR 环境烘托到纹路上;
  • ProRAW、DNG 等存储原始图画信息的格局,能够用于烘托来还原 EDR 的高亮特性。

2)在 SwiftUI 运用中运用 CoreImage 和 Metal 并为其增加 EDR 支撑

相关源码见:Generating an Animation with a Core Image Render Destination[3]

这个 Demo 中制作了一幅动画的 CIImage 并经过 Metal 来烘托它,这儿运用了 MTKView。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

大致流程如下图所示,即 MetalView 调用其delegate来制作,作为署理的 Renderer 在draw()办法中调用 ContentView 来供给图画去制作:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

其间,最核心的代码分别是:

  • MetalView 的makeView()办法:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

  • Renderer 的draw()办法:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

  • ContentView 的provider()办法:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

接下来,则是在这个流程中增加 EDR 支撑,包含 3 个进程:

  • 1、初始化 MetalView 时,为其增加 EDR 配置;
  • 2、每次烘托动作前,计算 EDR headroom;
  • 3、根据 EDR headroom 结构 CIImage。

对应的代码改动如下:

  • MetalView 的makeView()办法中,当构建 MetalView 时,要设置对应 layer 的几个特点如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

  • Renderer 的draw()办法中,每次烘托前需求获取 EDR headroom,并传给 provider:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

  • ContentView 的provider()办法中,要增加 headroom 参数,并运用这个 headroom 参数和 CIFilter 来一起构建 CIImage,这个 CIImage 就能够完结 EDR 烘托展现了:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

3)运用内置的 CIFilter 来支撑 EDR

CoreImage 中有超越 150 款 内置的 CIFilter 支撑 EDR。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

在运用一款 CIFilter 时,要想知道它是否支撑 EDR,能够用如下的代码来做一下检查:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

下面展现了怎么根据 headroom 编写一个能够生成高亮白色的 shading image,并结合一个 Ripple 作用的 CIFilter 来生成 EDR 的图画。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

4)根据 CIColorCube filters 编写自界说的 CIFilter 来支撑 EDR

其间 CIColorCubeWithColorSpace 是一个比较受欢迎的用于 SDR 图片的滤镜。以前,在运用它时有一个严厉的约束:输入和输出的 RGB 色彩值都在 0-1 的规模内。当咱们要支撑 EDR 时,能够配置 CIColorCubeWithColorSpace 滤镜的色彩空间为 EDR 格局的色彩空间,比方:HLG 或 PQ,这时候就能够打破 RGB 色彩值只在 0-1 规模的约束了,然后生产出最佳作用的 EDR 的内容。可是,需求留意,对应的 cube data 需求在对应色彩空间的有效规模内。一起,还可能需求增加 cube data 的维度。

有时候,你可能想要运用 SDR cube data 用于 EDR 图画,在最新的 API 中,能够设置extrapolate特点为true来告诉 filter 来对 SDR cube data 进行揣度,这时候你就能够给一个 filter 输入一个 EDR 图画,并从输出取得 EDR 图画。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

5)编写自界说 CIKernel 的最佳实践

以往对于 RGB 的值有必要坚持在 0-1 规模内的约束能够去掉了,超越这个规模,CIKernel 也能够正常工作。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

可是,alpha 值仍然需求坚持在 0-1 的规模内。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

3、根据 AVFoundation、Metal 展现 HDR 视频

拜见:Display HDR video in EDR with AVFoundation and Metal[4]

这个 Session 中介绍了怎么根据 AVFoundation 和 Metal 来构建高效的 EDR 烘托管线。其间,包含:

  • 介绍怎么支撑 EDR 视频的播映。不仅是简略的根据黑盒的 AVPlayer 来完结,会深化的介绍怎么根据 AVFoundation 来解码 HDR 视频,并在自界说的 EDR layer/view 上烘托。
  • 介绍怎么支撑 EDR 视频的后处理。根据 CoreVideo Display Link 实时拜访解码后的的视频帧并送给 CoreImage filter 或 Metal shader 来进行图画或特效处理,最终将处理后的视频帧交给 Metal 来烘托。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

整个 Session 的内容从下面几个方面打开:

1)Apple EDR 视频结构

Apple EDR 视频结构如下图所示:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

首先是 AVKit 结构,咱们能够根据 AVKit 来创立支撑视频播映的用户界面,完结传输操控、章节导航、画中画播映、字幕、隐藏式字幕显现等功能,AVKit 能够将 HDR 内容在 EDR 管线中播映。这些都能够经过 AVPlayerViewController 来完结。不过,假如想要进一步处理视频帧,那就要运用更底层的媒体结构来操控整个 pipeline。

接下来是 AVFoundation 结构,AVFoundation 是处理根据时间的音视频媒体的全功能结构。运用 AVFoundation 能够轻松的播映、创立和编辑 QuickTime 电影和 MP4 文件,播映 HLS 流,并在运用中构建强大的媒体功能。本次讲演中会探究 AVPlayer 和相关 AVPlayerLayer 接口的运用。

Core Video 是一个为数字视频供给管道模型的结构。它经过将流程划分为离散的进程来简化处理视频的办法。Core Video 还能够更轻松地拜访和操作单个帧,而不必忧虑数据类型之间的转化或显现同步。咱们将演示怎么结合运用 DisplayLink、CVPixelBuffer、Core Image,以及怎么配合运用 CVMetalTextureCache、Metal。

接着是 Video Toolbox 结构,这是一个底层结构,供给对硬件编码器和解码器的直接拜访。Video Toolbox 供给视频紧缩和解紧缩服务,以及存储在 Core Video 像素缓冲区中的光栅图画格局之间的转化。VTDecompressionSession 是一个强大的底层接口,本次不会评论,但高档开发人员能够进一步研究。

最终是 Core Media 结构,该结构界说了 AVFoundation 和其他高档媒体结构运用的媒体管道。能够运用 Core Media 的底层数据类型和接口来有效地处理媒体样本、管理媒体数据队列。

对于不同的运用场景,咱们能够挑选不同的结构来完结:

  • 简略的播映 HDR 视频,能够运用 AVKit 和 AVFoundation;
  • 在指定的 layer 上播映 HDR 视频,能够运用 AVPlayerLayer;
  • 对 HDR 视频帧做后处理,能够运用 AVPlayer、CADisplayLink 将 CVPixelBuffer 发送给 CoreImage 进行图画处理;
  • 对 HDR 视频帧做后处理和烘托,能够运用 AVPlayer、CVMetalTextureCache 将 MetalTexture 发送给 Metal 进行图画处理和烘托。

2)运用 AVKit 和 AVFoundation

假如需求简略的播映 HDR 视频媒体烘托到 EDR,能够运用 AVPlayerViewController 烘托 AVPlayer,也能够运用 AVPlayer 和 AVPlayerLayer 在 iOS 或 macOS 上播映自己的视图。

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

示例代码如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

假如需求完结实时视频作用,比方:

  • 特效:
    • Color grading
    • Chroma keying
  • 图画处理:
    • CoreImage filters
    • Metal shaders

大致流程如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

最终烘托一般都运用 CAMetalLayer,要支撑正确的烘托 HDR 视频,还需求为 CAMetalLayer 设置一些特点:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

CAMetalLayer 特点设置

接下来,持续展现怎么结合 AVPlayer 和 CADisplayLink 来实时拜访解码的视频帧,大致流程如下:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

下面是各个进程对应的示例代码:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

接下在 CADisplayLink 的回调中,咱们就能够从 AVPlayerItemVideoOutput 中来读取 CVPixelBuffer 图画信息进行后处理了。

一种办法是将 CVPixelBuffer 发送到 Core Image 进行处理。Core Image 能够将一个或多个 CIFilter 串起来,为视频帧供给 GPU 加速的图画处理。可是需求留意,并非一切的 CIFilter 都支撑 EDR,能够经过CIFilter.filterNames(inCategory: kCICategoryHighDynamicRange)来遍历支撑 EDR 的滤镜来运用。鄙人面的示例代码中,咱们来增加一个简略的滤镜作用:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

另一种办法是运用 Metal 和自界说的 Metal shader 来处理和烘托 CVPixelBuffer。咱们来简略介绍一下将 CVPixelBuffer 转化为 Metal 纹路的进程:

  • 从 CVPixelBuffer 中获取 IOSurface 目标;
  • 创立一个 MetalTextureDescriptor;
  • 把这个 MetalTextureDescriptor 作为参数,运用newTextureWithDescriptor从 MetalDevice 创立一个 MetalTexture。

这儿要当心可能存在纹路被重复运用和过度制作的问题,所以要当心的加锁;此外,并非一切的 PixelBuffer 格局都被 MetalTexture 支撑,这也是为什么咱们在示例顶用 half float 格局的原因。一起,完结这种转化以坚持最佳功能是一个深化的论题,这儿先不探讨了。

正因为这些复杂性,咱们才主张从 Core Video Metal 纹路缓存中获取 Metal 纹路,这是咱们鄙人一节内容中要介绍的。

3)运用 CoreVideo 和 Metal

CVMetalTextureCache 是一种将 CVPixelBuffer 与 Metal 结合运用的简略有效的办法。CVMetalTextureCache 很便利,能够直接从缓存中获取 Metal 纹路,无需进一步转化。CVMetalTextureCache 主动桥接 CVPixelBuffer 和 MetalTexture,然后既简化了代码,又坚持了高效。经过坚持 MTLTexture 到 IOSurface 的映射,CVMetalTextureCache 与 CVPixelBufferPools 配合运用还供给了功能优势。最终,运用 CVMetalTextureCache 消除了手动跟踪 IOSurfaces 的需求。下面的示例将展现怎么运用 CVMetalTextureCache 从 Core Video 中直接提取 Metal 纹路,大致流程如下图所示:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

下面是各个进程对应的示例代码:

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

WWDC 2022 音视频相关 Session 概览(EDR 相关)丨音视频工程示例

留意,在用 Objective-C 时需求确保在开释 CVMetalTextureRef 之前要完结对 Metal 纹路的运用,能够凭借 Metal 命令缓冲区的 completion 回调来完结。

参考资料

[1]Explore EDR on iOS:developer.apple.com/videos/play…

[2]Display EDR content with Core Image, Metal, and SwiftUI:developer.apple.com/videos/play…

[3]Animation with a Core Image Render:developer.apple.com/documentati…

[4]Display HDR video in EDR with AVFoundation and Metal:developer.apple.com/videos/play…

– 完 –

推荐阅读《WWDC 2022 音视频相关 Session 概览(HLS相关)》《iOS 视频处理结构及要点 API 合集》《iOS 音频处理结构及要点 API 合集》