1. 什么是HEIF
HEIF格式的全名為 High Efficiency Image File Format(高效率圖檔格式),是由動態(tài)圖像專家組(MPEG)在2013年推出的新格式(參見https://nokiatech.github.io/heif/)。
蘋果在iOS11系統(tǒng)中引入HEIF格式用于替代原來的JPG格式的圖片。使用HEVC的編碼技術(shù)存儲圖像數(shù)據(jù),進(jìn)一步減少存儲容量和提升圖像質(zhì)量。 據(jù)WWDC17數(shù)據(jù),使用HEIF會達(dá)到JPEG壓縮比的2倍。

2. 如何獲取HEIF格式的圖片
使用iOS11系統(tǒng)的iPhone手機,在相機的設(shè)置中格式選擇高效,拍攝下來的照片會保存為HEIF格式。
由于目前其他系統(tǒng)(Windows/Android)還不支持該格式圖片的顯示,所以在將iPhone中的照片導(dǎo)入到Windows PC時,iOS系統(tǒng)會將其轉(zhuǎn)碼為JPG格式圖片。目前只有macOS High Sierra版本的mac系統(tǒng)支持HEIF格式圖片,在將iPhone中的圖片導(dǎo)入到該系統(tǒng)的mac上時可以保持原有的格式(一般后綴名為.heic,表示圖像的編碼格式為HEVC格式)。
iOS設(shè)備通過AirDrop發(fā)給其他iOS設(shè)備時,如果接收方為iOS 10及以下OS版本時,發(fā)送方也會將heif圖片轉(zhuǎn)碼成JPG格式發(fā)送。
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)。
文件中所有的數(shù)據(jù)都存儲在稱為Box的數(shù)據(jù)塊結(jié)構(gòu)中,每個文件由若干個Box組成,每個Box有自己的類型和長度。在一個Box中還可以包含子Box,最終由一系列的Box組成完整的文件內(nèi)容,結(jié)構(gòu)如下圖所示,圖中每個方塊即代表一個Box。
我們常見的MP4文件同樣是ISOBMFF結(jié)構(gòu),所以HEIF文件結(jié)構(gòu)和MP4文件結(jié)構(gòu)基本一致,只是用到的Box類型有區(qū)別。
HEIF文件如果是單幅的靜態(tài)圖片的話,使用item的形式保存數(shù)據(jù),所有item單獨解碼;如果保存的為圖片序列的話,使用track的方式保存。此處我們只分析item形式的保存。

3.2 Box結(jié)構(gòu)
ISO/IEC 14496-12中這樣描述Box的結(jié)構(gòu)

size字段表示該Box的大小,type字段表示該Box的類型,一般使用4個可打印的字符組合表示,也稱為FOURCC,如圖1中的ftyp、moov、meta、mdat等。這一部分可以理解為Box的header,size中指定的Box大小去掉header后,剩下的部分為body的內(nèi)容,不同類型的Box中body部分的定義也不同,分別用來表示不同的含義。
3.3 HEIF格式圖片的文件結(jié)構(gòu)
3.3.1 整體結(jié)構(gòu)
如下圖,是使用iOS11系統(tǒng)的iphone7手機拍攝的圖片的文件結(jié)構(gòu)

它的最外一層由ftyp、meta和mdat三個Box組成,然后meta Box由包含有多個子Box,符合圖1的描述。
3.3.2 FileTypeBox
FileTypeBox在文件中有且僅有一個,它的類型字段值為ftyp,位于文件起始位置,其中的brand定義了文件中所存放的媒體類型,它的定義如下

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

我們測試用的文件內(nèi)容如下

紅圈標(biāo)識的即為major_brand字段的內(nèi)容,此處為heic,表示該文件中存儲的為HEVC(Main or Main Still Picture profile)格式編碼的圖片。
3.3.3 media data box
media data box的類型為mdat,它用來存儲實際圖片數(shù)據(jù)。數(shù)據(jù)的具體位置由meta box中定義。
3.3.4 meta box
meta box為一個container box,它里面包含有多個子box,各個子box一起定義了圖像數(shù)據(jù)的位置格式等信息。
- hdlr:HandlerBox,指明該meta信息描述的媒體類型,此處為pict
- dinf:在此處無用
- pitm:PrimaryItemBox,文件中會保存有多個item,使用該box指明要主item
- iinf:ItemInfoBox,該box中指明文件中共有多少個item,并包含有子box表明每個item的信息
- iref:ItemReferenceBox,該box包含有多個子box,每個子box指明一組相互有關(guān)聯(lián)的item
-
iprp:ItemPropertiesBox,它有ipco和ipma兩個子box
ipco box列出了所有item的所有屬性
ipma box中指明每個item都有哪些屬性
如下圖所示,ipco box列出了color、hvcC、ispe、irot、pixi等信,ipma中指明了item和屬性之間的關(guān)聯(lián)
id為1-48的item統(tǒng)一和3、1、2三個屬性關(guān)聯(lián),分別是ispe、clor和hvcC,其中hvcC類型的box中數(shù)據(jù)體部分為HevcDecoderConfigurationRecord結(jié)構(gòu)的數(shù)據(jù),從中可以獲取SPS、PPS、VPS等編碼參數(shù)相關(guān)數(shù)據(jù)
id為49的item擁有4、5、6三個屬性
id為50的item擁有7、8、9、5、10幾個屬性
圖8 - iprp - idat:ItemDataBox,item的數(shù)據(jù)除了保存在mdat中,還可以保存在idat box中,具體會保存在什么位置,由iloc box中指明
-
iloc:ItemLocationBox,該box指明了每個item在文件中的保存位置
如圖9所示,如果某個item的method字段為0,表示該item的數(shù)據(jù)保存在mdat box中,且此處指明保存位置的offset字段值為在整個文件中的偏移量,如果item的method字段為1,表明該item的數(shù)據(jù)保存在上面說的idat box中。
圖9 - iloc
4. 圖像的解碼顯示
通過iloc box獲取到具體某個item的數(shù)據(jù)的保存位置,即可從文件中提取出該數(shù)據(jù),這些數(shù)據(jù)實際內(nèi)容即為HEVC格式編碼的數(shù)據(jù),再利用ipco box中的hvcC數(shù)據(jù),獲取相應(yīng)的SPS、PPS和VPS信息,即可使用HEVC解碼器將數(shù)據(jù)解碼為一幅圖像。
實際使用iphone7拍攝出來的照片,文件中共有51個item,對應(yīng)的id為1-51,其中1-48的item信息基本一致,類型為hvc1,提取出item數(shù)據(jù)后可以使用HEVC解碼器解碼出圖像,但是觀察發(fā)現(xiàn)圖像均為完整照片的一部分。
pitm box中指明主item為49,所以顯示的時候需要依據(jù)id為49的item的格式顯示,該item類型為grid,該類型表明整個圖像被分割成多個小圖像分別進(jìn)行編碼保存。解析該item數(shù)據(jù)可以得到完整圖像被分割為6x8的小圖像,且通過iref box中可知,49號item想關(guān)聯(lián)的item為1-48號item,所以要顯示完整圖像時需要將1-48號item分別解碼,將獲取的圖像按照6x8的分割合并起來,形成一幅完整的圖像即為最終圖像。
從iref 和ipco box中可知,50號item數(shù)據(jù)為圖像的縮略圖,它有區(qū)別與1-48的編碼參數(shù)和格式,與49號item相關(guān)聯(lián),說明為49號item(即完整圖像)的縮略圖。
51號item類型為Exif,保存了相機相關(guān)信息。
5. 查看工具
基于QT的開源查看工具:https://github.com/ksvc/MediaParser,歡迎star!
轉(zhuǎn)載請注明:
作者金山視頻云,首發(fā)簡書 Jianshu.com
相關(guān)鏈接
- heif官方代碼:https://github.com/nokiatech/heif
- ISOBMFF:https://mpeg.chiariglione.org/standards/mpeg-4/iso-base-media-file-format
- 蘋果官方對HEIF格式的介紹: https://developer.apple.com/videos/play/wwdc2017/513/
也歡迎大家使用我們的直播、短視頻SDK。金山云SDK倉庫地址:
金山云SDK相關(guān)的QQ交流群:
- 視頻云技術(shù)交流群:574179720
- 視頻云iOS技術(shù)交流:621137661

