iOS-H264 硬解碼

iOS系統(tǒng)中H264硬解及顯示說明

蘋果在iOS 8.0系統(tǒng)之前媳否,沒有開放系統(tǒng)的硬件編碼解碼功能誓沸,不過Mac OS系統(tǒng)一直有,被稱為Video ToolBox的框架來處理硬件的編碼和解碼,終于在iOS 8.0后,蘋果將該框架引入iOS系統(tǒng)。

一荧止、VideoToolbox基本數(shù)據(jù)結(jié)構(gòu):

1、CVPixelBuffer:編碼前和解碼后的圖像數(shù)據(jù)結(jié)構(gòu)阶剑;

2跃巡、CMTime、CMClock和CMTimebase:時間戳相關(guān)牧愁。時間以64-bit/32-bit的形式出現(xiàn)素邪;

3、CMBlockBuffer:編碼后猪半,結(jié)果圖像的數(shù)據(jù)結(jié)構(gòu)兔朦;

4、CMVideoFormatDescription:圖像存儲方式磨确,編解碼器等格式描述沽甥;

5、CMSampleBuffer:存放編解碼前后的視頻圖像的容器數(shù)據(jù)結(jié)構(gòu)乏奥。

下圖為H264解碼前后數(shù)據(jù)結(jié)構(gòu)示意圖:

二摆舟、硬解使用方法:

H264的碼流由NALU單元組成,NALU單元包含視頻圖像數(shù)據(jù)和H264的參數(shù)信息邓了。其中視頻圖像數(shù)據(jù)就是CMBlockBuffer盏檐,而H264的參數(shù)信息則可以組合成FormatDesc。具體來說參數(shù)信息包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)驶悟。下圖顯示一個H264碼流的結(jié)構(gòu):

解碼方式一:(通過系統(tǒng)提供的AVSampleBufferDisplayLayer來解碼并顯示)

1、初始化H264硬解param:

1) 提取sps和pps生成format description;


//sps

_spsSize =format.getCsd_0_size()-4;_sps = (uint8_t *)malloc(_spsSize);memcpy(_sps,format.getCsd_0()+4, _spsSize);

//pps

_ppsSize =format.getCsd_1_size()-4;_pps = (uint8_t *)malloc(_ppsSize);memcpy(_pps,format.getCsd_1()+4, _ppsSize);


2) 使用CMVideoFormatDescriptionCreateFromH264ParameterSets函數(shù)來構(gòu)建CMVideoFormatDescriptionRef材失。


CMVideoFormatDescriptionCreateFromH264ParameterSets(kCFAllocatorDefault,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

2, //param count? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? parameterSetPointers,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? parameterSetSizes,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4, //nalstartcodesize&_decoderFormatDescription);


2痕鳍、將H264碼流轉(zhuǎn)換成解碼前的CMSampleBuffer:

? 1) 使用CMBlockBufferCreateWithMemoryBlock接口構(gòu)造CMBlockBufferRef;

CMBlockBufferRef blockBuffer=NULL;CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (void*)frame.bytes,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? frame.length,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCFAllocatorNull,NULL,0, frame.length,0,&blockBuffer);

? 2)根據(jù)上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可選的時間信息,使用CMSampleBufferCreate接口得到CMSampleBuffer數(shù)據(jù)這個待解碼的原始的數(shù)據(jù)笼呆。

CMSampleBufferRef sampleBuffer =NULL;CMSampleBufferCreateReady(kCFAllocatorDefault,? ? ? ? ? ? ? ? ? ? ? ? ? blockBuffer,? ? ? ? ? ? ? ? ? ? ? ? ? _decoderFormatDescription,1,0,NULL,1, sampleSizeArray,? ? ? ? ? ? ? ? ? ? ? ? ? &sampleBuffer);

3熊响、硬解圖像顯示:

通過系統(tǒng)提供的AVSampleBufferDisplayLayer來解碼并顯示。

AVSampleBufferDisplayLayer是蘋果提供的一個專門顯示編碼后的H264數(shù)據(jù)的顯示層诗赌,它是CALayer的子類汗茄,因此使用方式和其它CALayer類似。該層內(nèi)置了硬件解碼功能铭若,將原始的CMSampleBuffer解碼后的圖像直接顯示在屏幕上面洪碳,非常的簡單方便。

CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer,YES);CFMutableDictionaryRef dict = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachments,0);CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue);if(status == kCMBlockBufferNoErr) {

if([_avslayer isReadyForMoreMediaData]) ? ? ? ? ? ??{dispatch_sync(dispatch_get_main_queue(),^{ ? ? ? ?

? ? [_avslayer enqueueSampleBuffer:sampleBuffer]; ? ? ?

? ? });? ?

? }? ??

CFRelease(sampleBuffer);

}


解碼方式二:(通過VTDecompression接口叼屠,將CMSampleBuffer解碼成圖像瞳腌,將圖像通過UIImageView或者OpenGL來顯示)

1、初始化H264硬解param:

在方式一的基礎(chǔ)上,使用VTDecompressionSessionCreate接口構(gòu)造VTDecompressionSessionRef;(初始化VTDecompressionSession镜雨,設(shè)置解碼器的相關(guān)信息)

VTDecompressionSessionRef _deocderSession;VTDecompressionSessionCreate(kCFAllocatorDefault,? ? ? ? ? ? ? ? ? ? ? ? ? ? _decoderFormatDescription,NULL, attrs,? ? ? ? ? ? ? ? ? ? ? ? ? ? &callBackRecord,? ? ? ? ? ? ? ? ? ? ? ? ? ? &_deocderSession);

2嫂侍、將H264碼流轉(zhuǎn)換成解碼前的CMSampleBuffer:

同方式一

3、將CMSampleBuffer數(shù)據(jù)使用VTDecompressionSessionDecodeFrame接口解碼成CVPixelBufferRef數(shù)據(jù):

CVPixelBufferRef outputPixelBuffer=NULL;

VTDecompressionSessionDecodeFrame(_deocderSession,

sampleBuffer,

flags,

&outputPixelBuffer,

&flagOut);

4荚坞、將CVPixelBufferRef數(shù)據(jù)轉(zhuǎn)換成UIImage并顯示:

CIImage*ciImage= [CIImage imageWithCVPixelBuffer:outputPixelBuffer];UIImage*uiImage= [UIImage imageWithCIImage:ciImage];

三挑宠、程序流程框圖:

解碼方式一

解碼方式二

四、兩種解碼方式比較:

解碼方式一:

優(yōu)點(diǎn): 該方式通過系統(tǒng)提供的AVSampleBufferDisplayLayer顯示層來解碼并顯示颓影。該層內(nèi)置了硬件解碼功能各淀,將原始的CMSampleBuffer解碼后的圖像直接顯示在屏幕上,非常的簡單方便,且執(zhí)行效率高瞭空,占用內(nèi)存相對較少揪阿。

缺點(diǎn): 從解碼的數(shù)據(jù)中不能直接獲取圖像數(shù)據(jù)并對其做相應(yīng)處理,解碼后的數(shù)據(jù)不能直接進(jìn)行其他方面的應(yīng)用(一般要做較復(fù)雜的轉(zhuǎn)換)咆畏。

解碼方式二:

優(yōu)點(diǎn): 該方式通過VTDecompressionSessionDecodeFrame接口南捂,得到CVPixelBufferRef數(shù)據(jù),我們可以直接從CVPixelBufferRef數(shù)據(jù)中獲取圖像數(shù)據(jù)并對其做相應(yīng)處理旧找,方便于其他應(yīng)用溺健。

缺點(diǎn): 解碼中執(zhí)行效率相對降低,占用的內(nèi)存也會相對較大钮蛛。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('

').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介紹了iOS系統(tǒng)中H264硬解及顯示說明鞭缭,包括了方面的內(nèi)容,希望對IOS開發(fā)有興趣的朋友有所幫助魏颓。


加一條個人github上demo地址:h264硬解碼demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岭辣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甸饱,更是在濱河造成了極大的恐慌沦童,老刑警劉巖仑濒,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偷遗,居然都是意外死亡墩瞳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門氏豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喉酌,“玉大人,你說我怎么就攤上這事泵喘±岬纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵涣旨,是天一觀的道長歪架。 經(jīng)常有香客問我,道長霹陡,這世上最難降的妖魔是什么和蚪? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮烹棉,結(jié)果婚禮上攒霹,老公的妹妹穿的比我還像新娘。我一直安慰自己浆洗,他們只是感情好催束,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伏社,像睡著了一般抠刺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摘昌,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天速妖,我揣著相機(jī)與錄音,去河邊找鬼聪黎。 笑死罕容,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿饰。 我是一名探鬼主播锦秒,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喉镰!你這毒婦竟也來了旅择?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侣姆,失蹤者是張志新(化名)和其女友劉穎砌左,沒想到半個月后脖咐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汇歹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了偿凭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片产弹。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弯囊,靈堂內(nèi)的尸體忽然破棺而出痰哨,到底是詐尸還是另有隱情,我是刑警寧澤匾嘱,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布斤斧,位于F島的核電站,受9級特大地震影響霎烙,放射性物質(zhì)發(fā)生泄漏撬讽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一悬垃、第九天 我趴在偏房一處隱蔽的房頂上張望游昼。 院中可真熱鬧,春花似錦尝蠕、人聲如沸烘豌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廊佩。三九已至,卻和暖如春靖榕,著一層夾襖步出監(jiān)牢的瞬間标锄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工序矩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸯绿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓簸淀,卻偏偏與公主長得像瓶蝴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子租幕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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

  • iOS系統(tǒng)中H264硬解及顯示說明蘋果在iOS 8.0系統(tǒng)之前舷手,沒有開放系統(tǒng)的硬件編碼解碼功能,不過Mac OS系...
    rogerwu1228閱讀 1,868評論 0 4
  • 公司項目原因劲绪,接觸了一下視頻流H264的編解碼知識男窟,之前項目使用的是FFMpeg多媒體庫盆赤,利用CPU做視頻的編碼和...
    sillen閱讀 783評論 0 6
  • 近期開始學(xué)習(xí)H264的視頻流解析。寫此文章歉眷,作為記錄牺六,也梳理下相應(yīng)的知識點(diǎn)。 1. 解碼前我們先看一下H264的部...
    E31231V3閱讀 2,020評論 0 1
  • 硬件編碼相關(guān)知識(H264,H265) 閱讀人群:研究硬件編碼器應(yīng)用于iOS開發(fā)中,從0研究關(guān)于硬件編解碼汗捡,碼流中...
    小東邪啊閱讀 12,736評論 0 18
  • 當(dāng)一個視圖控制器被創(chuàng)建淑际,并在屏幕上顯示的時候。 代碼的執(zhí)行順序 1扇住、 alloc ...
    KimiY閱讀 296評論 0 0