iOS HEVC(H.265)

一、HEVC(H.265)介紹

HEVC全稱High Efficiency Video Coding(高效率視頻編碼)餐茵,是比H.264更加優(yōu)秀的一種視頻壓縮標(biāo)準(zhǔn)(也稱為H.265)休吠。H.265的壓縮性能要高于H.264一倍左右廊宪。
蘋果于北京時(shí)間2017年6月6日凌晨召開的WWDC 2017大會上推出了iOS 11系統(tǒng)爪喘,并推出了使用VideoToolBox對H.265的硬編硬解的支持。
但是并不是所有的iOS設(shè)備升級到iOS 11都可以使用H.265的硬編/解功能根盒,H.265硬解最少需要A9芯片的iPhone 6s/iPhone 6s Plus/iPhone SE,H.265硬編則最少需要A10芯片的iPhone 7/iPhone 7 Plus物蝙。


二郑象、VideoToolBox編碼

使用VideoToolBox進(jìn)行H.264和H.265編碼的流程完全相同,只在創(chuàng)建和配置編碼器上存在少量差異茬末,下面以VideoToolBox的編碼流程為線索,說明使用兩種編碼格式時(shí)的區(qū)別盖矫。

1. 創(chuàng)建VTCompressionSession
VT_EXPORT OSStatus 
VTCompressionSessionCreate(
    CM_NULLABLE CFAllocatorRef                          allocator,
    int32_t                                             width,
    int32_t                                             height,
    CMVideoCodecType                                    codecType,
    CM_NULLABLE CFDictionaryRef                         encoderSpecification,
    CM_NULLABLE CFDictionaryRef                         sourceImageBufferAttributes,
    CM_NULLABLE CFAllocatorRef                          compressedDataAllocator,
    CM_NULLABLE VTCompressionOutputCallback             outputCallback,
    void * CM_NULLABLE                                  outputCallbackRefCon,
    CM_RETURNS_RETAINED_PARAMETER CM_NULLABLE VTCompressionSessionRef * CM_NONNULL compressionSessionOut) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));
  • 如果使用H.264編碼功能丽惭,參數(shù)codecType需要設(shè)置為kCMVideoCodecType_H264
  • 如果使用H.265編碼功能辈双,參數(shù)codecType需要設(shè)置為kCMVideoCodecType_HEVC;

其他參數(shù)在使用兩種編碼格式時(shí)沒有區(qū)別责掏。

2. 設(shè)置編碼相關(guān)參數(shù)
VT_EXPORT OSStatus 
VTSessionSetProperty(
  CM_NONNULL VTSessionRef       session,
  CM_NONNULL CFStringRef        propertyKey,
  CM_NULLABLE CFTypeRef         propertyValue ) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));

其中在配置kVTCompressionPropertyKey_ProfileLevel屬性時(shí),H.264和H.265有各自不同的ProfileLevel定義湃望,與H.265相關(guān)的只有兩個(gè)换衬,如下所示:

VT_EXPORT const CFStringRef kVTProfileLevel_HEVC_Main_AutoLevel API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0));
VT_EXPORT const CFStringRef kVTProfileLevel_HEVC_Main10_AutoLevel API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0));
3. 啟動(dòng)編碼
VT_EXPORT OSStatus
VTCompressionSessionPrepareToEncodeFrames( CM_NONNULL VTCompressionSessionRef session ) API_AVAILABLE(macosx(10.9), ios(8.0), tvos(10.2));
4. 循環(huán)輸入源數(shù)據(jù)(yuv類型)
VT_EXPORT OSStatus
VTCompressionSessionEncodeFrame(
    CM_NONNULL VTCompressionSessionRef  session,
    CM_NONNULL CVImageBufferRef         imageBuffer,
    CMTime                              presentationTimeStamp,
    CMTime                              duration, // may be kCMTimeInvalid
    CM_NULLABLE CFDictionaryRef         frameProperties,
    void * CM_NULLABLE                  sourceFrameRefCon,
    VTEncodeInfoFlags * CM_NULLABLE     infoFlagsOut ) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));
5. 獲取編碼后的數(shù)據(jù)

通過在創(chuàng)建VTCompressionSession傳入回調(diào)函數(shù),獲取編碼后的數(shù)據(jù)证芭。

typedef void (*VTCompressionOutputCallback)(
        void * CM_NULLABLE outputCallbackRefCon,
        void * CM_NULLABLE sourceFrameRefCon, 
        OSStatus status, 
        VTEncodeInfoFlags infoFlags,
        CM_NULLABLE CMSampleBufferRef sampleBuffer );

至此針對使用VideoToolBox進(jìn)行H.264/H.265編碼的基本流程已經(jīng)介紹完畢瞳浦。


三、VideoToolBox解碼

VideoToolBox的解碼主要涉及以下幾個(gè)函數(shù):

VTDecompressionSessionCreate 創(chuàng)建解碼session
VTDecompressionSessionDecodeFrame 解碼一個(gè)frame
VTDecompressionSessionInvalidate 銷毀解碼session

其中VTDecompressionSessionCreate創(chuàng)建session時(shí)需要CMVideoFormatDescriptionRef類型的視頻格式描述废士,而對于CMVideoFormatDescriptionRef叫潦,VideoToolBox中提供了多個(gè)方法可以創(chuàng)建:

CMVideoFormatDescriptionCreate
CMVideoFormatDescriptionCreateForImageBuffer
CMVideoFormatDescriptionCreateFromH264ParameterSets
CMVideoFormatDescriptionCreateFromHEVCParameterSets

其中最后一個(gè)CMVideoFormatDescriptionCreateFromHEVCParameterSets是在iOS11中新增的一個(gè)方法,用以創(chuàng)建H.265視頻格式的描述官硝。

對于H.264和H.265的解碼矗蕊,在VideoToolBox層面的操作完全一致,唯一不同的就是視頻格式的描述類型不同氢架。最常使用也最容易理解的為后兩個(gè)通過ParameterSets來創(chuàng)建的函數(shù)傻咖,前兩個(gè)函數(shù)的創(chuàng)建方式未作詳細(xì)了解。

至此岖研,對使用VideoToolBox解碼H.265視頻的重點(diǎn)就放在如何獲取ParameterSets(即VPS卿操、SPS和PPS)上。


四孙援、H.265 NALU

與H.264的NALU Header相比(H.264的NALU Header為一個(gè)字節(jié))硬纤,H.265的NALU Header由兩個(gè)字節(jié)構(gòu)成:
0----------------1----------------
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| F | Type | LayerId | TID |
+------------ - +---------------- - +

H265 nalu header

HEVC加入了NAL所在的時(shí)間層的ID,去除了nal_ref_idc赃磨,此信息合并到了naltype中筝家。通常情況下F為0,layerid為0, TID為1邻辉。

類型判斷方式為分隔符之后的第一個(gè)字節(jié)右移一位的值溪王。
所以腮鞍,H.265編碼格式的NALU類型判斷方式如下,code為NALU Header的第一個(gè)字節(jié):

int type = (code & 0x7E)>>1;

00 00 00 01 40 01 的nuh_unit_type的值為 32莹菱, 語義為視頻參數(shù)集 VPS
00 00 00 01 42 01 的nuh_unit_type的值為 33移国, 語義為序列參數(shù)集 SPS
00 00 00 01 44 01 的nuh_unit_type的值為 34, 語義為圖像參數(shù)集 PPS
00 00 00 01 4E 01 的nuh_unit_type的值為 39道伟, 語義為補(bǔ)充增強(qiáng)信息 SEI
00 00 00 01 26 01 的nuh_unit_type的值為 19迹缀, 語義為可能有RADL圖像的IDR圖像的SS編碼數(shù)據(jù) IDR
00 00 00 01 02 01 的nuh_unit_type的值為1, 語義為被參考的后置圖像蜜徽,且非TSA祝懂、非STSA的SS編碼數(shù)據(jù)

在編碼過程中,從編碼器獲取碼流的時(shí)候拘鞋,1砚蓬、2、3盆色、4灰蛙、5是在一幀數(shù)據(jù)當(dāng)中。相當(dāng)于H.264的I幀隔躲。


本文主要參考并轉(zhuǎn)載來自于作者:金山視頻云
地址:基于iOS11的HEVC(H.265)硬編碼/硬解碼功能開發(fā)指南

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摩梧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宣旱,更是在濱河造成了極大的恐慌障本,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响鹃,死亡現(xiàn)場離奇詭異驾霜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)买置,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門粪糙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忿项,你說我怎么就攤上這事蓉冈。” “怎么了轩触?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵寞酿,是天一觀的道長。 經(jīng)常有香客問我脱柱,道長伐弹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任榨为,我火速辦了婚禮惨好,結(jié)果婚禮上煌茴,老公的妹妹穿的比我還像新娘。我一直安慰自己日川,他們只是感情好蔓腐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龄句,像睡著了一般回论。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上分歇,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天傀蓉,我揣著相機(jī)與錄音,去河邊找鬼卿樱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硫椰,可吹牛的內(nèi)容都是我干的繁调。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靶草,長吁一口氣:“原來是場噩夢啊……” “哼蹄胰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕翔,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裕寨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后派继,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宾袜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年驾窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庆猫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绅络,死狀恐怖月培,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恩急,我是刑警寧澤杉畜,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站衷恭,受9級特大地震影響此叠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜随珠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一拌蜘、第九天 我趴在偏房一處隱蔽的房頂上張望杆烁。 院中可真熱鬧,春花似錦简卧、人聲如沸兔魂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽析校。三九已至,卻和暖如春铜涉,著一層夾襖步出監(jiān)牢的瞬間智玻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工芙代, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吊奢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓纹烹,卻偏偏與公主長得像页滚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子铺呵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容