• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 學習電腦 > 電腦硬件知識 > 硬件知識 > ios硬件解碼器是什么

    ios硬件解碼器是什么

    時間: 捷鋒774 分享

    ios硬件解碼器是什么

      蘋果公司1980年12月12日公開招股上市,2012年創下6235億美元的市值記錄,截至2014年6月,蘋果公司已經連續三年成為全球市值最大公司。下面是學習啦小編帶來的關于ios硬件解碼器是什么的內容,歡迎閱讀!

      ios硬件解碼器是什么?

      公司項目原因,接觸了一下視頻流H264的編解碼知識,之前項目使用的是FFMpeg多媒體庫,利用CPU做視頻的編碼和解碼,俗稱為軟編軟解。該方法比較通用,但是占用CPU資源,編解碼效率不高。一般系統都會提供GPU或者專用處理器來對視頻流進行編解碼,也就是硬件編碼和解碼,簡稱為硬編解碼。蘋果在iOS 8.0系統之前,沒有開放系統的硬件編碼解碼功能,不過Mac OS系統一直有,被稱為Video ToolBox的框架來處理硬件的編碼和解碼,終于在iOS 8.0后,蘋果將該框架引入iOS系統。

      由此,開發者便可以在iOS里面,調用Video Toolbox框架提供的接口,來對視頻進行硬件編解碼的工作,為VOIP視頻通話,視頻流播放等應用的視頻編解碼提供了便利。

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

      一,VideoToolbox基本數據結構。

      Video Toolbox視頻編解碼前后需要應用的數據結構進行說明。

      (1)CVPixelBuffer:編碼前和解碼后的圖像數據結構。

      (2)CMTime、CMClock和CMTimebase:時間戳相關。時間以64-bit/32-bit的形式出現。

      (3)CMBlockBuffer:編碼后,結果圖像的數據結構。

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

      (5)CMSampleBuffer:存放編解碼前后的視頻圖像的容器數據結構。

      圖1.1視頻H264編解碼前后數據結構示意圖

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

      二,硬解碼使用方法。

      通過如圖2.1所示的一個典型應用,來說明如何使用硬件解碼接口。該應用場景是從網絡處傳來H264編碼后的視頻碼流,最后顯示在手機屏幕上。

      圖2.1 H264典型應用場景

      1,將H264碼流轉換成解碼前的CMSampleBuffer。

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

      H264的碼流由NALU單元組成,NALU單元包含視頻圖像數據和H264的參數信息。其中視頻圖像數據就是CMBlockBuffer,而H264的參數信息則可以組合成FormatDesc。具體來說參數信息包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)。圖2.2顯示一個H264碼流的結構。

      圖2.2 H264碼流結構

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

      a,每個NALU的開始碼是0x00 00 01,按照開始碼定位NALU。

      b,通過類型信息找到sps和pps并提取,開始碼后第一個byte的后5位,7代表sps,8代表pps。

      c,CMVideoFormatDescriptionCreateFromH264ParameterSets函數來構建CMVideoFormatDescriptionRef。具體代碼可以見demo。

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

      a,通過開始碼,定位到NALU。

      b,確定類型為數據后,將開始碼替換成NALU的長度信息(4 Bytes)。

      c,CMBlockBufferCreateWithMemoryBlock接口構造CMBlockBufferRef。具體代碼可以見demo。

      (3)根據需要,生成CMTime信息。(實際測試時,加入time信息后,有不穩定的圖像,不加入time信息反而沒有,需要進一步研究,這里建議不加入time信息)

      根據上述得到CMVideoFormatDescriptionRef、CMBlockBufferRef和可選的時間信息,使用CMSampleBufferCreate接口得到CMSampleBuffer數據這個待解碼的原始的數據。見圖2.3的H264數據轉換示意圖。

      圖2.3 H264碼流轉換CMSampleBuffer示意圖

      2,硬件解碼圖像顯示。

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

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

      AVSampleBufferDisplayLayer是蘋果提供的一個專門顯示編碼后的H264數據的顯示層,它是CALayer的子類,因此使用方式和其它CALayer類似。該層內置了硬件解碼功能,將原始的CMSampleBuffer解碼后的圖像直接顯示在屏幕上面,非常的簡單方便。圖2.4顯示了這一解碼過程。

      圖2.4 AVSampleBufferDisplayLayer硬解壓后顯示圖像

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

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

      a,初始化VTDecompressionSession,設置解碼器的相關信息。初始化信息需要CMSampleBuffer里面的FormatDescription,以及設置解碼后圖像的存儲方式。demo里面設置的CGBitmap模式,使用RGB方式存放。編碼后的圖像經過解碼后,會調用一個回調函數,將解碼后的圖像交個這個回調函數來進一步處理。我們就在這個回調里面,將解碼后的圖像發給control來顯示,初始化的時候要將回調指針作為參數傳給create接口函數。最后使用create接口對session來進行初始化。

      b,a中所述的回調函數可以完成CGBitmap圖像轉換成UIImage圖像的處理,將圖像通過隊列發送到Control來進行顯示處理。

      c,調用VTDecompresSessionDecodeFrame接口進行解碼操作。解碼后的圖像會交由a,b步驟設置的回調函數,來進一步的處理。

      圖2.5顯示來硬解碼的過程步驟。

      圖2.5 VTDecompression硬解碼過程示意圖

      三,硬編碼使用方法。

      硬編碼的使用也通過一個典型的應用場景來描述。首先,通過攝像頭來采集圖像,然后將采集到的圖像,通過硬編碼的方式進行編碼,最后編碼后的數據將其組合成H264的碼流通過網絡傳播。

      1,攝像頭采集數據。

      攝像頭采集,iOS系統提供了AVCaptureSession來采集攝像頭的圖像數據。設定好session的采集解析度。再設定好input和output即可。output設定的時候,需要設置delegate和輸出隊列。在delegate方法,處理采集好的圖像。

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

      2,使用VTCompressionSession進行硬編碼。

      (1)初始化VTCompressionSession。

      VTCompressionSession初始化的時候,一般需要給出width寬,height長,編碼器類型kCMVideoCodecType_H264等。然后通過調用VTSessionSetProperty接口設置幀率等屬性,demo里面提供了一些設置參考,測試的時候發現幾乎沒有什么影響,可能需要進一步調試。最后需要設定一個回調函數,這個回調是視頻圖像編碼成功后調用。全部準備好后,使用VTCompressionSessionCreate創建session。

      (2)提取攝像頭采集的原始圖像數據給VTCompressionSession來硬編碼。

      攝像頭采集后的圖像是未編碼的CMSampleBuffer形式,利用給定的接口函數CMSampleBufferGetImageBuffer從中提取出CVPixelBufferRef,使用硬編碼接口VTCompressionSessionEncodeFrame來對該幀進行硬編碼,編碼成功后,會自動調用session初始化時設置的回調函數。

      (3)利用回調函數,將因編碼成功的CMSampleBuffer轉換成H264碼流,通過網絡傳播。

      基本上是硬解碼的一個逆過程。解析出參數集SPS和PPS,加上開始碼后組裝成NALU。提取出視頻數據,將長度碼轉換成開始碼,組長成NALU。將NALU發送出去。

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

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

      四,硬編解碼的一些編碼說明。

      由于Video Toolbox是基礎的core Foundation庫函數,C語言寫成,和使用core Foundation所有的其它功能一樣需要適應,記得Github有個同志,將其改成了OC語言能方便調用的模式,但是地址忘了,以后有緣找到,就會提供下鏈接。

      文/Ethan_Struggle(簡書作者)

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

      著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

    746955 主站蜘蛛池模板: 五十路在线播放| 国产精亚洲视频| 制服丝袜日韩欧美| 中文字幕无码不卡免费视频| 高辣h浪荡小说校花系花2| 欧美另类老少配hd| 国产精品无码无卡在线播放| 亚洲欧美日韩中文字幕网址| 97天天摸天天碰天天爽| 波多野结衣一区二区三区在线观看 | 欧美日韩一区二区三区麻豆 | 嗨动漫在线观看| 中文字幕无码不卡一区二区三区 | 欧美人与性禽xxxx| 国产精品乱码久久久久久软件| 亚洲午夜精品一区二区公牛电影院| 69视频在线看| 欧美一级高清免费a| 国产成人综合色视频精品| 久久精品国产精品亚洲毛片| 进进出出稚嫩娇小狭窄| 拍拍拍无档又黄又爽视频| 四虎影永久在线观看网址| 一本大道久久a久久精品综合 | 暖暖免费高清日本一区二区三区| 国产成人无码一区二区在线播放| 久久精品中文字幕| 色片免费在线观看| 情侣视频精品免费的国产| 免费黄色毛片视频| 99re在线视频播放| 欧美乱妇高清视频免欢看关| 国产好深好硬好爽我还要视频| 久久伊人免费视频| 精品国产精品久久一区免费式| 女人18毛片a级18**多水真多| 亚洲第一成年网站大全亚洲| 中文字幕激情视频| 日本h片无遮挡在线观看| 全黄性性激高免费视频| 91嫩草视频在线观看|