亚洲高清vr播放在线观看,欧美亚洲精品免费,欧美日韩天堂在线视频,午夜福利小视频

      學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 電腦硬件知識(shí) > 硬件知識(shí) > ios硬件解碼器是什么

      ios硬件解碼器是什么

      時(shí)間: 捷鋒774 分享

      ios硬件解碼器是什么

        蘋(píng)果公司1980年12月12日公開(kāi)招股上市,2012年創(chuàng)下6235億美元的市值記錄,截至2014年6月,蘋(píng)果公司已經(jīng)連續(xù)三年成為全球市值最大公司。下面是學(xué)習(xí)啦小編帶來(lái)的關(guān)于ios硬件解碼器是什么的內(nèi)容,歡迎閱讀!

        ios硬件解碼器是什么?

        公司項(xiàng)目原因,接觸了一下視頻流H264的編解碼知識(shí),之前項(xiàng)目使用的是FFMpeg多媒體庫(kù),利用CPU做視頻的編碼和解碼,俗稱(chēng)為軟編軟解。該方法比較通用,但是占用CPU資源,編解碼效率不高。一般系統(tǒng)都會(huì)提供GPU或者專(zhuān)用處理器來(lái)對(duì)視頻流進(jìn)行編解碼,也就是硬件編碼和解碼,簡(jiǎn)稱(chēng)為硬編解碼。蘋(píng)果在iOS 8.0系統(tǒng)之前,沒(méi)有開(kāi)放系統(tǒng)的硬件編碼解碼功能,不過(guò)Mac OS系統(tǒng)一直有,被稱(chēng)為Video ToolBox的框架來(lái)處理硬件的編碼和解碼,終于在iOS 8.0后,蘋(píng)果將該框架引入iOS系統(tǒng)。

        由此,開(kāi)發(fā)者便可以在iOS里面,調(diào)用Video Toolbox框架提供的接口,來(lái)對(duì)視頻進(jìn)行硬件編解碼的工作,為VOIP視頻通話(huà),視頻流播放等應(yīng)用的視頻編解碼提供了便利。

        (PS:按照蘋(píng)果WWDC2014 513《direct access to media encoding and decoding》的描述,蘋(píng)果之前提供的AVFoundation框架也使用硬件對(duì)視頻進(jìn)行硬編碼和解碼,但是編碼后直接寫(xiě)入文件,解碼后直接顯示。Video Toolbox框架可以得到編碼后的幀結(jié)構(gòu),也可以得到解碼后的原始圖像,因此具有更大的靈活性做一些視頻圖像處理。)

        一,VideoToolbox基本數(shù)據(jù)結(jié)構(gòu)。

        Video Toolbox視頻編解碼前后需要應(yīng)用的數(shù)據(jù)結(jié)構(gòu)進(jìn)行說(shuō)明。

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

        (2)CMTime、CMClock和CMTimebase:時(shí)間戳相關(guān)。時(shí)間以64-bit/32-bit的形式出現(xiàn)。

        (3)CMBlockBuffer:編碼后,結(jié)果圖像的數(shù)據(jù)結(jié)構(gòu)。

        (4)CMVideoFormatDescription:圖像存儲(chǔ)方式,編解碼器等格式描述。

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

        圖1.1視頻H264編解碼前后數(shù)據(jù)結(jié)構(gòu)示意圖

        如圖1.1所示,編解碼前后的視頻圖像均封裝在CMSampleBuffer中,如果是編碼后的圖像,以CMBlockBuffe方式存儲(chǔ);解碼后的圖像,以CVPixelBuffer存儲(chǔ)。CMSampleBuffer里面還有另外的時(shí)間信息CMTime和視頻描述信息CMVideoFormatDesc。

        二,硬解碼使用方法。

        通過(guò)如圖2.1所示的一個(gè)典型應(yīng)用,來(lái)說(shuō)明如何使用硬件解碼接口。該應(yīng)用場(chǎng)景是從網(wǎng)絡(luò)處傳來(lái)H264編碼后的視頻碼流,最后顯示在手機(jī)屏幕上。

        圖2.1 H264典型應(yīng)用場(chǎng)景

        1,將H264碼流轉(zhuǎn)換成解碼前的CMSampleBuffer。

        由圖1.1所示,解碼前的CMSampleBuffer = CMTime + FormatDesc + CMBlockBuffer。需要從H264的碼流里面提取出以上的三個(gè)信息。最后組合成CMSampleBuffer,提供給硬解碼接口來(lái)進(jìn)行解碼工作。

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

        圖2.2 H264碼流結(jié)構(gòu)

        (1)提取sps和pps生成format description。

        a,每個(gè)NALU的開(kāi)始碼是0x00 00 01,按照開(kāi)始碼定位NALU。

        b,通過(guò)類(lèi)型信息找到sps和pps并提取,開(kāi)始碼后第一個(gè)byte的后5位,7代表sps,8代表pps。

        c,CMVideoFormatDescriptionCreateFromH264ParameterSets函數(shù)來(lái)構(gòu)建CMVideoFormatDescriptionRef。具體代碼可以見(jiàn)demo。

        (2)提取視頻圖像數(shù)據(jù)生成CMBlockBuffer。

        a,通過(guò)開(kāi)始碼,定位到NALU。

        b,確定類(lèi)型為數(shù)據(jù)后,將開(kāi)始碼替換成NALU的長(zhǎng)度信息(4 Bytes)。

        c,CMBlockBufferCreateWithMemoryBlock接口構(gòu)造CMBlockBufferRef。具體代碼可以見(jiàn)demo。

        (3)根據(jù)需要,生成CMTime信息。(實(shí)際測(cè)試時(shí),加入time信息后,有不穩(wěn)定的圖像,不加入time信息反而沒(méi)有,需要進(jìn)一步研究,這里建議不加入time信息)

        根據(jù)上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可選的時(shí)間信息,使用CMSampleBufferCreate接口得到CMSampleBuffer數(shù)據(jù)這個(gè)待解碼的原始的數(shù)據(jù)。見(jiàn)圖2.3的H264數(shù)據(jù)轉(zhuǎn)換示意圖。

        圖2.3 H264碼流轉(zhuǎn)換CMSampleBuffer示意圖

        2,硬件解碼圖像顯示。

        硬件解碼顯示的方式有兩種:

        (1)通過(guò)系統(tǒng)提供的AVSampleBufferDisplayLayer來(lái)解碼并顯示。

        AVSampleBufferDisplayLayer是蘋(píng)果提供的一個(gè)專(zhuān)門(mén)顯示編碼后的H264數(shù)據(jù)的顯示層,它是CALayer的子類(lèi),因此使用方式和其它CALayer類(lèi)似。該層內(nèi)置了硬件解碼功能,將原始的CMSampleBuffer解碼后的圖像直接顯示在屏幕上面,非常的簡(jiǎn)單方便。圖2.4顯示了這一解碼過(guò)程。

        圖2.4 AVSampleBufferDisplayLayer硬解壓后顯示圖像

        顯示的接口為[_avslayer enqueueSampleBuffer:sampleBuffer];

        (2)通過(guò)VTDecompression接口來(lái),將CMSampleBuffer解碼成圖像,將圖像通過(guò)UIImageView或者OpenGL上顯示。

        a,初始化VTDecompressionSession,設(shè)置解碼器的相關(guān)信息。初始化信息需要CMSampleBuffer里面的FormatDescription,以及設(shè)置解碼后圖像的存儲(chǔ)方式。demo里面設(shè)置的CGBitmap模式,使用RGB方式存放。編碼后的圖像經(jīng)過(guò)解碼后,會(huì)調(diào)用一個(gè)回調(diào)函數(shù),將解碼后的圖像交個(gè)這個(gè)回調(diào)函數(shù)來(lái)進(jìn)一步處理。我們就在這個(gè)回調(diào)里面,將解碼后的圖像發(fā)給control來(lái)顯示,初始化的時(shí)候要將回調(diào)指針作為參數(shù)傳給create接口函數(shù)。最后使用create接口對(duì)session來(lái)進(jìn)行初始化。

        b,a中所述的回調(diào)函數(shù)可以完成CGBitmap圖像轉(zhuǎn)換成UIImage圖像的處理,將圖像通過(guò)隊(duì)列發(fā)送到Control來(lái)進(jìn)行顯示處理。

        c,調(diào)用VTDecompresSessionDecodeFrame接口進(jìn)行解碼操作。解碼后的圖像會(huì)交由a,b步驟設(shè)置的回調(diào)函數(shù),來(lái)進(jìn)一步的處理。

        圖2.5顯示來(lái)硬解碼的過(guò)程步驟。

        圖2.5 VTDecompression硬解碼過(guò)程示意圖

        三,硬編碼使用方法。

        硬編碼的使用也通過(guò)一個(gè)典型的應(yīng)用場(chǎng)景來(lái)描述。首先,通過(guò)攝像頭來(lái)采集圖像,然后將采集到的圖像,通過(guò)硬編碼的方式進(jìn)行編碼,最后編碼后的數(shù)據(jù)將其組合成H264的碼流通過(guò)網(wǎng)絡(luò)傳播。

        1,攝像頭采集數(shù)據(jù)。

        攝像頭采集,iOS系統(tǒng)提供了AVCaptureSession來(lái)采集攝像頭的圖像數(shù)據(jù)。設(shè)定好session的采集解析度。再設(shè)定好input和output即可。output設(shè)定的時(shí)候,需要設(shè)置delegate和輸出隊(duì)列。在delegate方法,處理采集好的圖像。

        注意,需要說(shuō)明的是,圖像輸出的格式,是未編碼的CMSampleBuffer形式。

        2,使用VTCompressionSession進(jìn)行硬編碼。

        (1)初始化VTCompressionSession。

        VTCompressionSession初始化的時(shí)候,一般需要給出width寬,height長(zhǎng),編碼器類(lèi)型kCMVideoCodecType_H264等。然后通過(guò)調(diào)用VTSessionSetProperty接口設(shè)置幀率等屬性,demo里面提供了一些設(shè)置參考,測(cè)試的時(shí)候發(fā)現(xiàn)幾乎沒(méi)有什么影響,可能需要進(jìn)一步調(diào)試。最后需要設(shè)定一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)是視頻圖像編碼成功后調(diào)用。全部準(zhǔn)備好后,使用VTCompressionSessionCreate創(chuàng)建session。

        (2)提取攝像頭采集的原始圖像數(shù)據(jù)給VTCompressionSession來(lái)硬編碼。

        攝像頭采集后的圖像是未編碼的CMSampleBuffer形式,利用給定的接口函數(shù)CMSampleBufferGetImageBuffer從中提取出CVPixelBufferRef,使用硬編碼接口VTCompressionSessionEncodeFrame來(lái)對(duì)該幀進(jìn)行硬編碼,編碼成功后,會(huì)自動(dòng)調(diào)用session初始化時(shí)設(shè)置的回調(diào)函數(shù)。

        (3)利用回調(diào)函數(shù),將因編碼成功的CMSampleBuffer轉(zhuǎn)換成H264碼流,通過(guò)網(wǎng)絡(luò)傳播。

        基本上是硬解碼的一個(gè)逆過(guò)程。解析出參數(shù)集SPS和PPS,加上開(kāi)始碼后組裝成NALU。提取出視頻數(shù)據(jù),將長(zhǎng)度碼轉(zhuǎn)換成開(kāi)始碼,組長(zhǎng)成NALU。將NALU發(fā)送出去。

        圖2.6顯示了整個(gè)硬編碼的處理邏輯。

        圖2.6硬編碼處理流程示意圖

        四,硬編解碼的一些編碼說(shuō)明。

        由于Video Toolbox是基礎(chǔ)的core Foundation庫(kù)函數(shù),C語(yǔ)言寫(xiě)成,和使用core Foundation所有的其它功能一樣需要適應(yīng),記得Github有個(gè)同志,將其改成了OC語(yǔ)言能方便調(diào)用的模式,但是地址忘了,以后有緣找到,就會(huì)提供下鏈接。

        文/Ethan_Struggle(簡(jiǎn)書(shū)作者)

        原文鏈接:http://www.jianshu.com/p/a6530fa46a88

        著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書(shū)作者”。

      746955