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倍。
使用iOS11系統(tǒng)的iPhone手機(jī),在相機(jī)的設(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ā)送。
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單獨(dú)解碼;如果保存的為圖片序列的話,使用track的方式保存。此處我們只分析item形式的保存。
ISO/IEC 14496-12中這樣描述Box的結(jié)構(gòu)
如下圖,是使用iOS11系統(tǒng)的iphone7手機(jī)拍攝的圖片的文件結(jié)構(gòu)
它的最外一層由ftyp、meta和mdat三個Box組成,然后meta Box由包含有多個子Box,符合圖1的描述。
FileTypeBox在文件中有且僅有一個,它的類型字段值為ftyp,位于文件起始位置,其中的brand定義了文件中所存放的媒體類型,它的定義如下
如果文件為HEIF格式,它的major_brand字段會是以下表格中所示:
紅圈標(biāo)識的即為major_brand字段的內(nèi)容,此處為heic,表示該文件中存儲的為HEVC(Main or Main Still Picture profile)格式編碼的圖片。
media data box的類型為mdat,它用來存儲實(shí)際圖片數(shù)據(jù)。數(shù)據(jù)的具體位置由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幾個屬性
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中。
通過iloc box獲取到具體某個item的數(shù)據(jù)的保存位置,即可從文件中提取出該數(shù)據(jù),這些數(shù)據(jù)實(shí)際內(nèi)容即為HEVC格式編碼的數(shù)據(jù),再利用ipco box中的hvcC數(shù)據(jù),獲取相應(yīng)的SPS、PPS和VPS信息,即可使用HEVC解碼器將數(shù)據(jù)解碼為一幅圖像。
實(shí)際使用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,保存了相機(jī)相關(guān)信息。
基于QT的開源查看工具:https://github.com/ksvc/MediaParser,歡迎star!
轉(zhuǎn)載請注明:
作者金山視頻云,首發(fā)簡書 Jianshu.com
聯(lián)系客服