[Diving into WWDC 2017] Introducing HEIF and HEVC

HEIF 和 HEVC 介绍

观察一下我们生活的当今世界,越来越多的人生产和消费以图像、视频为载体的内容。不仅如此,这些媒体内容也在不停的变换新的格式,比如高分辨率的 4K 视频,HDR 视频。媒体的生态也在发生着改变。但是这些变化也受到了带宽等传输上的限制。所以目前大范围使用的 H.264 编码技术和 JPEG 格式已经无法满足用户的需求,我们需要一种更高效的编码技术来适应时代。

在本次 WWDC 中,苹果宣布他们采纳了新的一项应用于视频和图片的编码技术 HEVC,和一种新的图片文件格式:HEIF,并且在今年发布的操作系统中将集成这两项新技术。这篇文章简要介绍了 HEVC 和 HEIF 的优势,以及如何在苹果的生态中应用它们。

本篇相关文档和 session 有:

一、HEVC

苹果采纳了 HEVC 作为下一代编码技术。 HEVC 是 High Efficiency Video Coding(高效率视频编码)的缩写,是一种应用于视频和图片的标准化编码技术。2013 年,HEVC 通过了 ITU-T 的标准化认证:

  • ISO/IEC: MPEG-H Part 2
  • ITU-T: H.265 HEVC 继承自 H.264,但是对比 H.264,它的压缩效率有着明显的改进。

是什么让 HEVC 成为了卓越的编码方式?HEVC 和 H.264 很相似,都是通过区块来完成压缩,运用时空压缩技术获得压缩收益

在编码技术上,HEVC 有这样几个特点:

  • H.264 有 16x16 的宏区块(Macroblock),而 HEVC 引入了编码树单元(Coding Tree Block, CTU)的概念,并支持 8x8 到 64x64 像素的编码树单元,更大的区块意味着能获得更大的压缩收益,而这种收益对于高分辨率视频和图片尤其明显
  • H.264有 8x8 或 4x4 的离散余弦变换(Discrete Cosine Transform,DCT),而 HEVC 不仅使用了离散余弦变换,还使用了离散正弦变换(Discrete Sine Transform),并且支持最高 32x32 的变换
  • 为了获得更好的空间压缩,HEVC 引入了更好的帧内预测方向模式
  • 更好的运动补偿,能够生成更精确的半像素和四分之一像素
  • 作为基于块的编码算法,HEVC 改进了环路滤波器,拥有解块滤波器(Deblocking)与样本自适应偏移量(SAO)滤波器

有了这些编码层面的优化,和 H.264 相比,HEVC 在视频压缩上有了显著提升:

  • 对于大部分案例,和 H.264 相比,在生成同样品质的视频时,HEVC 能节约 40% 的带宽
  • 在一些其他用例,比如 iOS 的相机,HEVC 节约的带宽能达到 H.264 的 2 倍

在其他细节方面,HEVC也有显著提升

  • HEVC 支持 Main、Main 10 及 Main Still Picture profile,由于 Main 10 profile 的存在,视频可以以 10-bit 被编码和解码,能获得更多灰度、更多色彩,更好质量
  • hvc1 编码技术来实现播放,这意味着参数要存在解码器中
  • HEVC 原生适配现有的文件格式:QuickTime Movie 和 MPEG-4

总之,使用 HEVC 的好处有如下几点:

  • 工业界和苹果都对它进行了支持
  • 采用工业标准的文件格式
  • 是视频和图片压缩的理想编码

二、HEIF

HEVC 既可以编码视频,也可以编码图像。HEVC 编码的视频可以使用现有的视频格式,但是 HEVC 编码的图像则没有相应的格式可以用。所以我们需要开发一种全新的图片格式,来支持 HEVC 编码的图片。这种格式就是 HEIF。

在介绍 HEIF 之前,我们先罗列一下这种新的图片格式的需求:

  • 支持压缩编码,特别是 HEVC
  • 支持 alpha 通道和景深信息
  • 支持动画,比如 GIF、Live Photo
  • 支持图片序列的压缩,比如连拍照片
  • 支持快速预览;支持图片分割,比如当我对一张大图的一小部分感兴趣时,需要快速展示这一小部分

考虑到上面这些需求,苹果选择HEIF作为新的图片格式。

HEIF 是 High Efficiency Image File Format 的缩写,在 2015 年通过了 ISO 标准,是基于 ISO Base Media File Format 的容器格式。支持单张图片和图片序列并有良好的扩展性。HEIF 一般使用 HEVC 进行压缩,同时也能支持其他的编码方式,但苹果生成 HEIF 格式资源时是只会选用 HEVC 编码。

HEVC 在视频压缩上有着卓越表现,在图片压缩上也是。在同样的空间下,使用 HEVC 编码的 HEIF 格式能存储 JPEG 两倍的图片。

使用 HEVC 编码的 HEIF 格式的扩展名为 .heic,而使用 H264 编码的 HEIF 格式的扩展名为 .avci。更通用的,其他支持的编码方式编码的 HEIF 格式,扩展名为 .heif。

三、HEIF 和 HEVC 在苹果生态中的应用

上面我们介绍了 HEIF 和 HEVC 是什么,这两项技术的优势,以及苹果为什么选择了它们。苹果已经做了很多工作,将 HEIF 和 HEVC 尽可能透明的集成进入苹果的生态中。我们将从访问、创建和传输三个方面介绍。

  • 创建:应该如何创建 HEIF 图像和 HEVC 编码的视频内容
  • 访问:如何访问 HEIF 图像和 HEVC 视频内容
  • 传输:应该使用什么样的策略来传输 HEIF 图像和 HEVC 视频

访问

HEIF 格式的内部

HEIF 是 ISO 标准的格式,它的内部结构与 MP4 和 MOV 看起来比较相似。

HEIF 是一种容器格式,比起 JPEG,它有着更大的自由度。它内部的数据可以用 HEVC 方式编码,图片内容被按照 512x512 tiles 的方式编码,这让 HEIF 在快速增量加载一张高分辨率图片的某一部分时有了明显的优势。

HEIF 内部有一个 320x240 内嵌的缩略图,对比如今 JPEG 内嵌的 160x120 分辨率的缩略图,这个缩略图的分辨率是 JPEG 的四倍,但是大小却只有两倍,因为这个缩略图也使用 HEVC 进行编码。

HEIF 中包含的图片的 Exif 信息,和 JPEG 中的 Exif 信息兼容。
使用 HEVC 编码的 HEIF 格式,将使用一个全新的扩展名,.heic 扩展名。

HEIF 的解码支持

安装了 macOS 10.13 或者 iOS 11的设备都能支持 HEIF 的解码,其中 A9 芯片以上的 iOS 设备(iPhone6s 或 iPad Pro)和 6 代因特尔内核的 macOS 设备(the new MacBook with the touch bar)支持硬件解码。

在软件层面,苹果已经提供了支持HEIF解码的框架:

  • ImageIO 支持 HEIF 作为源进行解码以及增量加载、metadata 和缩略图抽象,并且和其他图像格式使用同样的接口
  • CoreImage 支持 HEIF 作为源进行实时计算
  • PhotoKit 支持直接从资源库中访问 HEIF
  • 苹果自带的 APP 也原生支持 HEIF,比如照片、预览等等

HEVC 的解码支持

现有的 QuickTime 视频格式可以支持 HEVC 解码,所以 HEVC 编码的视频依然使用 .mov 作为扩展名。 HEVC 还支持 8-bit 和 10-bit 编码,所以那些非常注重图像质量的视频可以使用 10-bit 编码器进行非实时的编码。

安装了 macOS 10.13 或者 iOS 11 的设备都能支持 HEVC 8-bit 和 10-bit 解码,其中 A9 芯片以上的 iOS 设备(iPhone6s 或 iPad Pro)支持 8-bit 和 10-bit 的硬件解码,6 代因特尔内核的 macOS 设备(the new MacBook with the touch bar)支持 8-bit 的硬件解码,7 代因特尔内核的 macOS 设备支持 10-bit 的硬件解码。

在软件层面上,苹果也为 HEVC 提供了支持:

  • AVFoundation 支持播放、创建和编辑 HEVC 视频
  • PhotoKit 支持 HEVC 视频
  • WebKit 支持播放 HEVC 视频,但仅限于支持硬件加速的设备或者 macOS 桌面设备
  • HTTP Live Streaming 支持 HEVC 视频,这视频的传输优化带来了机会
  • 苹果自带的 APP 也原生支持 HEVC,比如 quickTime player,相册,FaceTime 等

但是支持对 HEVC 的解码并不意味着支持播放,由于在某些平台上解码的速度非常缓慢,所以无法支持实时播放。AVFoundation 提供了“isPlayable”接口来指示当前设备是否支持 HEVC 视频的播放。

对于开发者来说,访问这些接口,可以获得 HEIF 和 HEVC 的原始数据:

  • 通过 PHImageManager,可以请求到原始的HEIF图像
  • 通过 PHImageManager,还可以请求HEVC编码的视频对象
  • 通过 PHAssetResourceManager,可以管理所有具体的相册资源,其中也包括了 HEVC 和 HEIF 的内容
  • 通过 PHContentEditingInput,可以将 HEVC 和 HEIF 作为输入进行编辑

创建

HEIF 编码的硬件支持

目前,HEIF 编码的硬件加速仅仅支持 A10 芯片的 iOS 设备,比如 iPhone 7 和 iPhone 7 plus

HEIF 编码的软件支持

  • ImageIO 支持将 HEIF 作为目标格式,使用 ImageIO 框架,开发者可以将 JPEG 转换成 HEIF
  • AVFoundation 的录制接口也支持将 HEIF 作为输出的目标格式
  • 使用苹果的相机拍摄可以得到 HEIF 格式的图片(除了连拍) 值得注意的是,苹果提供的这些框架,只支持 HEVC 编码的 HEIF 格式

HEVC 视频编码的硬件支持

A10 芯片的 iOS 设备支持 8-bit 硬件加速编码,6 代因特尔内核处理器的 macOS 设备支持 8-bit 硬件编码,其他的 mac 设备支持 10-bit 软件编码

HEVC 视频编码的软件支持

  • 使用 AVFoundation 框架,转码输出 HEVC
  • 使用 AVFoundation 框架录制 HEVC 视频
  • 使用苹果自带的相机拍摄默认可以得到 HEVC 编码的视频

传输

如果我们要将 HEVC 或者 HEIF 从支持的设备上传输走,我们可能需要考虑接收的设备是否能支持 HEVC 和 HEIF,这里就有可能涉及到转码。

在传输中,有这样两种可以考虑的策略

  • 总是转码
  • 对接收方进行能力评估

如果我们要将 HEIF 图片分享到网络上,由于在这种情况下无法判定接收的设备是否能支持 HEIF,所以此时采用的是总是转码的策略。

如果我们要将 HEIF 图片点对点传给另一个设备,此时我们不希望承担转码和带宽的消耗,就会使用能力评估策略,在建立连接的时候会有一次握手来判断对方设备是否支持 HEIF 和 HEVC。

随着 HEIF 和 HEVC 的普及,在传输期间进行转码的案例预计会越来越少。

作为苹果采纳的下一代编码方式和下一代图像格式,HEVC 和 HEIF 在展现出了卓越的压缩效率。然而目前,HEVC 和 HEIF 均只能最新的系统上使用,且在硬件加速方面还有诸多限制,所以对于中型和大型 app 的第三方开发者来说,要在自己的 app 中使用 HEVC 和 HEIF,可能还需要一些等待。