HEIF格式解析

1. 什么是HEIF

HEIF格式的全名为 High Efficiency Image File Format(高效率图档格式),是由动态图像专家组(MPEG)在2013年推出的新格式(参见https://nokiatech.github.io/heif/)。
苹果在iOS11系统中引入HEIF格式用于替代原来的JPG格式的图片。使用HEVC的编码技术存储图像数据,进一步减少存储容量和提升图像质量。 据WWDC17数据,使用HEIF会达到JPEG压缩比的2倍。

图0 - heif compression from WWDC17

2. 如何获取HEIF格式的图片

使用iOS11系统的iPhone手机,在相机的设置中格式选择高效,拍摄下来的照片会保存为HEIF格式。
由于目前其他系统(Windows/Android)还不支持该格式图片的显示,所以在将iPhone中的照片导入到Windows PC时,iOS系统会将其转码为JPG格式图片。目前只有macOS High Sierra版本的mac系统支持HEIF格式图片,在将iPhone中的图片导入到该系统的mac上时可以保持原有的格式(一般后缀名为.heic,表示图像的编码格式为HEVC格式)。
iOS设备通过AirDrop发给其他iOS设备时,如果接收方为iOS 10及以下OS版本时,发送方也会将heif图片转码成JPG格式发送。

3. HEIF格式说明

3.1 ISO Base Media File Format

HEIF格式是基于 ISO Base Media File Format格式衍生出来的图像封装格式,所以它的文件格式同样符合ISO Base Media File Format (ISO/IEC 14496-12)中的定义( ISOBMFF)。
文件中所有的数据都存储在称为Box的数据块结构中,每个文件由若干个Box组成,每个Box有自己的类型和长度。在一个Box中还可以包含子Box,最终由一系列的Box组成完整的文件内容,结构如下图所示,图中每个方块即代表一个Box。
我们常见的MP4文件同样是ISOBMFF结构,所以HEIF文件结构和MP4文件结构基本一致,只是用到的Box类型有区别。
HEIF文件如果是单幅的静态图片的话,使用item的形式保存数据,所有item单独解码;如果保存的为图片序列的话,使用track的方式保存。此处我们只分析item形式的保存。

图1 - ISOBMFF

3.2 Box结构

ISO/IEC 14496-12中这样描述Box的结构

图2 - Box

size字段表示该Box的大小,type字段表示该Box的类型,一般使用4个可打印的字符组合表示,也称为FOURCC,如图1中的ftyp、moov、meta、mdat等。这一部分可以理解为Box的header,size中指定的Box大小去掉header后,剩下的部分为body的内容,不同类型的Box中body部分的定义也不同,分别用来表示不同的含义。

3.3 HEIF格式图片的文件结构

3.3.1 整体结构

如下图,是使用iOS11系统的iphone7手机拍摄的图片的文件结构


图4 - HEIC文件结构

它的最外一层由ftyp、meta和mdat三个Box组成,然后meta Box由包含有多个子Box,符合图1的描述。

3.3.2 FileTypeBox

FileTypeBox在文件中有且仅有一个,它的类型字段值为ftyp,位于文件起始位置,其中的brand定义了文件中所存放的媒体类型,它的定义如下


图5 - ftyp Box

如果文件为HEIF格式,它的major_brand字段会是以下表格中所示:


图6 - brand

我们测试用的文件内容如下
图7 - ftyp

红圈标识的即为major_brand字段的内容,此处为heic,表示该文件中存储的为HEVC(Main or Main Still Picture profile)格式编码的图片。

3.3.3 media data box

media data box的类型为mdat,它用来存储实际图片数据。数据的具体位置由meta box中定义。

3.3.4 meta box

meta box为一个container box,它里面包含有多个子box,各个子box一起定义了图像数据的位置格式等信息。

  • hdlr:HandlerBox,指明该meta信息描述的媒体类型,此处为pict
  • dinf:在此处无用
  • pitm:PrimaryItemBox,文件中会保存有多个item,使用该box指明要主item
  • iinf:ItemInfoBox,该box中指明文件中共有多少个item,并包含有子box表明每个item的信息
  • iref:ItemReferenceBox,该box包含有多个子box,每个子box指明一组相互有关联的item
  • iprp:ItemPropertiesBox,它有ipco和ipma两个子box
    ipco box列出了所有item的所有属性
    ipma box中指明每个item都有哪些属性
    如下图所示,ipco box列出了color、hvcC、ispe、irot、pixi等信,ipma中指明了item和属性之间的关联
    id为1-48的item统一和3、1、2三个属性关联,分别是ispe、clor和hvcC,其中hvcC类型的box中数据体部分为HevcDecoderConfigurationRecord结构的数据,从中可以获取SPS、PPS、VPS等编码参数相关数据
    id为49的item拥有4、5、6三个属性
    id为50的item拥有7、8、9、5、10几个属性


    图8 - iprp
  • idat:ItemDataBox,item的数据除了保存在mdat中,还可以保存在idat box中,具体会保存在什么位置,由iloc box中指明
  • iloc:ItemLocationBox,该box指明了每个item在文件中的保存位置
    如图9所示,如果某个item的method字段为0,表示该item的数据保存在mdat box中,且此处指明保存位置的offset字段值为在整个文件中的偏移量,如果item的method字段为1,表明该item的数据保存在上面说的idat box中。


    图9 - iloc

4. 图像的解码显示

通过iloc box获取到具体某个item的数据的保存位置,即可从文件中提取出该数据,这些数据实际内容即为HEVC格式编码的数据,再利用ipco box中的hvcC数据,获取相应的SPS、PPS和VPS信息,即可使用HEVC解码器将数据解码为一幅图像。
实际使用iphone7拍摄出来的照片,文件中共有51个item,对应的id为1-51,其中1-48的item信息基本一致,类型为hvc1,提取出item数据后可以使用HEVC解码器解码出图像,但是观察发现图像均为完整照片的一部分。
pitm box中指明主item为49,所以显示的时候需要依据id为49的item的格式显示,该item类型为grid,该类型表明整个图像被分割成多个小图像分别进行编码保存。解析该item数据可以得到完整图像被分割为6x8的小图像,且通过iref box中可知,49号item想关联的item为1-48号item,所以要显示完整图像时需要将1-48号item分别解码,将获取的图像按照6x8的分割合并起来,形成一幅完整的图像即为最终图像。
从iref 和ipco box中可知,50号item数据为图像的缩略图,它有区别与1-48的编码参数和格式,与49号item相关联,说明为49号item(即完整图像)的缩略图。
51号item类型为Exif,保存了相机相关信息。

5. 查看工具

基于QT的开源查看工具:https://github.com/ksvc/MediaParser,欢迎star!

转载请注明:
作者金山视频云,首发简书 Jianshu.com


相关链接


也欢迎大家使用我们的直播、短视频SDK。金山云SDK仓库地址:

https://github.com/ksvc

金山云SDK相关的QQ交流群:

  • 视频云技术交流群:574179720
  • 视频云iOS技术交流:621137661
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265