AAC杂穷、H264網(wǎng)絡(luò)流播放-H264硬解碼顯示

h264視頻

收到的純視頻或者音頻的數(shù)據(jù)應(yīng)該先保存到本地悍缠,用vlc先測試,如果能播放證明數(shù)據(jù)沒有問題耐量,才好進(jìn)行下一步解碼播放

關(guān)于VideoToolBox也有很多的東西飞蚓,接口和屬性的定義等,找到兩篇文章做了介紹
使用VideoToolbox硬解碼H.264
VideoToolbox解析

當(dāng)初自己注釋的代碼不小心刪了,現(xiàn)在對比著demo在捋一下流程decode demo

  • 聲明用到的幾個成員
//sps 和 pps的內(nèi)存區(qū)以及大小
uint8_t *_sps;
NSInteger _spsSize;
uint8_t *_pps;
NSInteger _ppsSize;
//解碼會話的引用
VTDecompressionSessionRef _deocderSession;
//描述媒體數(shù)據(jù)和其他各樣的類型的引用
CMVideoFormatDescriptionRef _decoderFormatDescription;
  • 解碼的入口
#pragma mark - 對外提供解碼接口
-(void) decodeNalu:(uint8_t *)frame withSize:(uint32_t)frameSize;

1.此函數(shù)中廊蜒,將前四個字節(jié)替換為數(shù)據(jù)幀的大小減去00 00 00 01四個字節(jié);這一步我記得有一個方法可以直接轉(zhuǎn)換的(CFSwapInt32HostToBig)著榴,現(xiàn)在是手動一個字節(jié)一個字節(jié)轉(zhuǎn)的。
2.判斷脑又,nalu類型锐借,如果是5代表關(guān)鍵幀初始化解碼器,7和8分別初始化sps和pps其他的就是數(shù)據(jù)幀調(diào)用解碼函數(shù)钞翔。

  • 初始化解碼器

按流程倒著來:
為解碼視頻幀創(chuàng)建一個解碼會話严卖,VTDecompressionSessionCreate布轿,解碼的幀會通過回調(diào)函數(shù)發(fā)出。函數(shù)要傳遞一些參數(shù)
1.分配器疟呐,傳NULL使用默認(rèn)的即可
2.videoFormatDescription就是成員描述媒體數(shù)據(jù)的那個引用
3.指定一個專門的視頻解碼器东且,傳入NULL讓video toolbox選擇一個解碼器
4.想要輸出的圖像數(shù)據(jù)的屬性等
5.解碼后的回調(diào)函數(shù)
6.成員中的那個deocderSession來接收創(chuàng)建的這個解碼會話

然后可以為這個會話設(shè)置一些屬性

//kVTDecompressionPropertyKey_RealTime 解碼實時輸出珊泳,后面那個參數(shù)具體沒弄清呢
VTSessionSetProperty(_deocderSession, kVTDecompressionPropertyKey_RealTime, kCFBooleanTrue);

這樣的話拷沸,在initH264Decoder方法中最開始那些操作當(dāng)然就是為VTDecompressionSessionCreate這個做的一些準(zhǔn)備了⊙砹耍看看就懂了序无。

  • 解碼

通過CMBlockBufferCreateWithMemoryBlock方法創(chuàng)建CMBlockBufferRef衡创,在用BlockBuffer通過CMSampleBufferCreateReady創(chuàng)建CMSampleBufferRef璃氢,然后使用VTDecompressionSessionDecodeFrame進(jìn)行解碼狮辽,解碼后會調(diào)用回調(diào)函數(shù)。在回調(diào)函數(shù)中喉脖,使用了代理傳出解碼后的數(shù)據(jù)树叽,進(jìn)行顯示。

在這個解碼方法中有個sourceFrameRefCon參數(shù)须误,傳入了一開始定義的CVPixelBufferRef outputPixelBuffer = NULL;這里這個參數(shù)跟回調(diào)函數(shù)中那個sourceFrameRefCon是一個仇轻。

  • 顯示的方法:這里直接使用了apple寫好的一個AAPLEAGLLayer來顯示了,貌似還可以轉(zhuǎn)為圖片顯示哦
//先創(chuàng)建
-(void)createLayer{
    _playLayer = [[AAPLEAGLLayer alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    _playLayer.backgroundColor = [UIColor blackColor].CGColor;
    [self.layer addSublayer:_playLayer];
}
//代理
#pragma mark -  解碼回調(diào)
- (void)displayDecodedFrame:(CVImageBufferRef )imageBuffer{
    if(imageBuffer)
    {
        _playLayer.pixelBuffer = imageBuffer;
        CVPixelBufferRelease(imageBuffer);
    }
    return;
}
  • 關(guān)于一些數(shù)據(jù)結(jié)構(gòu)定義

1祭椰、CVPixelBuffer:編碼前和解碼后的圖像數(shù)據(jù)結(jié)構(gòu)方淤;
2蹄殃、CMBlockBuffer:編碼后圖像的數(shù)據(jù)結(jié)構(gòu);
而CMSampleBuffer就相當(dāng)于一個容器诅岩,他存放上面兩種類型的一種以及cmtime等一些參數(shù)吩谦。供編解碼器使用。

我們還可以看到一些結(jié)構(gòu)如下:

typedef CVImageBufferRef CVPixelBufferRef;  
typedef CVBufferRef CVImageBufferRef;

一開始納悶這是啥意思咐扭,這樣有啥用,后來看文檔說的很清楚:CVBuffer就像抽象基類一樣袜爪,他定義了如何與緩沖區(qū)的數(shù)據(jù)進(jìn)行交互穗慕。這個buffer可以包含視頻,音頻等怀各,像CVImageBuffer瓢对,CVPixelBuffer都是由它衍生出來的胰苏。這一點和CMVideoFormatDescriptionRef也類似,CMFormatDescriptions代表一些描述信息硕并,可以用來描述音頻視頻等類型,也是基類一樣埃仪,具體明確的description就有CMVideoFormatDescription和CMAudioFormatDescription陕赃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末么库,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葡缰,更是在濱河造成了極大的恐慌忱反,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異该互,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蔓搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門喂分,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲祈,“玉大人,你說我怎么就攤上這事梆掸。” “怎么了怪得?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵徒恋,是天一觀的道長欢伏。 經(jīng)常有香客問我颜懊,道長,這世上最難降的妖魔是什么匠璧? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任夷恍,我火速辦了婚禮媳维,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘指黎。我一直安慰自己醋安,他們只是感情好杂彭,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布亲怠。 她就那樣靜靜地躺著团秽,像睡著了一般叭首。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻报,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天间螟,我揣著相機(jī)與錄音,去河邊找鬼荣瑟。 笑死摩泪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚷掠。 我是一名探鬼主播不皆,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼霹娄,長吁一口氣:“原來是場噩夢啊……” “哼犬耻!你這毒婦竟也來了枕磁?” 一聲冷哼從身側(cè)響起术吝,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纪岁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡漩氨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了做修。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗坯,死狀恐怖宾濒,靈堂內(nèi)的尸體忽然破棺而出绘梦,到底是詐尸還是另有隱情赴魁,我是刑警寧澤尚粘,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布秉继,位于F島的核電站泽铛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盔腔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一宁赤、第九天 我趴在偏房一處隱蔽的房頂上張望决左。 院中可真熱鬧,春花似錦走贪、人聲如沸佛猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽继找。三九已至,卻和暖如春逃沿,著一層夾襖步出監(jiān)牢的瞬間婴渡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工凯亮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留缩搅,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓触幼,卻偏偏與公主長得像硼瓣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子置谦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

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

  • 硬件編碼相關(guān)知識(H264,H265) 閱讀人群:研究硬件編碼器應(yīng)用于iOS開發(fā)中,從0研究關(guān)于硬件編解碼堂鲤,碼流中...
    小東邪啊閱讀 12,790評論 0 18
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,787評論 0 15
  • 為什么要進(jìn)行編碼 因為未經(jīng)過編碼(壓縮)的視頻,具有極大的數(shù)據(jù)量,不利于存儲,傳輸,實時應(yīng)用. 視頻編碼的原理 空...
    癡人會說夢閱讀 3,280評論 6 3
  • 本來寫下來的一句話是無論我走到哪里,夏天的夜晚都是相似的寓涨,但小心翼翼地一想戒良,這樣說未免顯得自大糯崎,好像我走南闖北見多...
    一碗不辣的面閱讀 924評論 0 1