不支持,支持H263編碼,264你可以從opencore中進行提取或者從ffmpeg中繼續(xù)擰移植來解析H264
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計、成都做網(wǎng)站與策劃設(shè)計,寧安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寧安等地區(qū)。寧安做網(wǎng)站價格咨詢:18980820575
H264壓縮技術(shù)主要采用了以下幾種方法對視頻數(shù)據(jù)進行壓縮。包括:
解決的是空域數(shù)據(jù)冗余問題。
解決的是時域數(shù)據(jù)冗徐問題
將空間上的相關(guān)性變?yōu)轭l域上無關(guān)的數(shù)據(jù)然后進行量化。
經(jīng)過壓縮后的幀分為:I幀,P幀和B幀:
關(guān)鍵幀,采用幀內(nèi)壓縮技術(shù)。
向前參考幀,在壓縮時,只參考前面已經(jīng)處理的幀。采用幀音壓縮技術(shù)。
雙向參考幀,在壓縮時,它即參考前而的幀,又參考它后面的幀。采用幀間壓縮技術(shù)。
除了I/P/B幀外,還有圖像序列GOP。
H264的基本原理其實非常簡單,下我們就簡單的描述一下H264壓縮數(shù)據(jù)的過程。通過攝像頭采集到的視頻幀(按每秒 30 幀算),被送到 H264 編碼器的緩沖區(qū)中。編碼器先要為每一幅圖片劃分宏塊。
劃分好宏塊后,計算宏塊的象素值。以此類推,計算一幅圖像中每個宏塊的像素值。
對于視頻數(shù)據(jù)主要有兩類數(shù)據(jù)冗余,一類是時間上的數(shù)據(jù)冗余,另一類是空間上的數(shù)據(jù)冗余。其中時間上的數(shù)據(jù)冗余是最大的。為什么說時間上的冗余是最大的呢?假設(shè)攝像頭每秒抓取30幀,這30幀的數(shù)據(jù)大部分情況下都是相關(guān)聯(lián)的。也有可能不止30幀的的數(shù)據(jù),可能幾十幀,上百幀的數(shù)據(jù)都是關(guān)聯(lián)特別密切的。
H264編碼器會按順序,每次取出兩幅相鄰的幀進行宏塊比較,計算兩幀的相似度。如下圖:
在H264編碼器中將幀分組后,就要計算幀組內(nèi)物體的運動矢量了。
H264編碼器首先按順序從緩沖區(qū)頭部取出兩幀視頻數(shù)據(jù),然后進行宏塊掃描。當(dāng)發(fā)現(xiàn)其中一幅圖片中有物體時,就在另一幅圖的鄰近位置(搜索窗口中)進行搜索。如果此時在另一幅圖中找到該物體,那么就可以計算出物體的運動矢量了。
運動矢量計算出來后,將相同部分(也就是綠色部分)減去,就得到了補償數(shù)據(jù)。我們最終只需要將補償數(shù)據(jù)進行壓縮保存,以后在解碼時就可以恢復(fù)原圖了。壓縮補償后的數(shù)據(jù)只需要記錄很少的一點數(shù)據(jù)。
我們把運動矢量與補償稱為 幀間壓縮技術(shù) ,它解決的是視頻幀在時間上的數(shù)據(jù)冗余。除了幀間壓縮,幀內(nèi)也要進行數(shù)據(jù)壓縮,幀內(nèi)數(shù)據(jù)壓縮解決的是空間上的數(shù)據(jù)冗余。
人眼對圖象都有一個識別度,對低頻的亮度很敏感,對高頻的亮度不太敏感。所以基于一些研究,可以將一幅圖像中人眼不敏感的數(shù)據(jù)去除掉。這樣就提出了幀內(nèi)預(yù)測技術(shù)。
一幅圖像被劃分好宏塊后,對每個宏塊可以進行 9 種模式的預(yù)測。找出與原圖最接近的一種預(yù)測模式。然后,將原始圖像與幀內(nèi)預(yù)測后的圖像相減得殘差值。再將我們之前得到的預(yù)測模式信息一起保存起來,這樣我們就可以在解碼時恢復(fù)原圖了,經(jīng)過幀內(nèi)與幀間的壓縮后,雖然數(shù)據(jù)有大幅減少,但還有優(yōu)化的空間。
可以將殘差數(shù)據(jù)做整數(shù)離散余弦變換,去掉數(shù)據(jù)的相關(guān)性,進一步壓縮數(shù)據(jù)。
上面的幀內(nèi)壓縮是屬于有損壓縮技術(shù)。也就是說圖像被壓縮后,無法完全復(fù)原。而CABAC屬于無損壓縮技術(shù)。
無損壓縮技術(shù)大家最熟悉的可能就是哈夫曼編碼了,給高頻的詞一個短碼,給低頻詞一個長碼從而達到數(shù)據(jù)壓縮的目的。MPEG-2中使用的VLC就是這種算法,我們以 A-Z 作為例子,A屬于高頻數(shù)據(jù),Z屬于低頻數(shù)據(jù)??纯此侨绾巫龅摹?/p>
CABAC也是給高頻數(shù)據(jù)短碼,給低頻數(shù)據(jù)長碼。同時還會根據(jù)上下文相關(guān)性進行壓縮,這種方式又比VLC高效很多。
制定了相互傳輸?shù)母袷剑瑢⒑昕?有組織,有結(jié)構(gòu),有順序的形成一系列的碼流。這種碼流既可 通過 InputStream 網(wǎng)絡(luò)流的數(shù)據(jù)進行傳輸,也可以封裝成一個文件進行保存,主要作用是為了傳輸。
組成H264碼流的結(jié)構(gòu)中 包含以下幾部分 ,從大到小排序依次是:
H264視頻序列,圖像,片組,片,NALU,宏塊 ,像素。
NAL層:(Network Abstraction Layer,視頻數(shù)據(jù)網(wǎng)絡(luò)抽象層) : 它的作用是H264只要在網(wǎng)絡(luò)上傳輸,在傳輸?shù)倪^程每個包以太網(wǎng)是1500字節(jié),而H264的幀往往會大于1500字節(jié),所以要進行拆包,將一個幀拆成多個包進行傳輸,所有的拆包或者組包都是通過NAL層去處理的。
VCL層:(Video Coding Layer,視頻數(shù)據(jù)編碼層) : 對視頻原始數(shù)據(jù)進行壓縮
起始碼0x 00 00 00 01 或者 0x 00 00 01 作為 分隔符 。
兩個 0x 00 00 00 01之間的字節(jié)數(shù)據(jù) 是表示一個NAL Unit。
I 幀的特點:
1.分組:把幾幀圖像分為一組(GOP,也就是一個序列),為防止運動變化,幀數(shù)不宜取多。
2.定義幀:將每組內(nèi)各幀圖像定義為三種類型,即I幀、B幀和P幀;
3.預(yù)測幀:以I幀做為基礎(chǔ)幀,以I幀預(yù)測P幀,再由I幀和P幀預(yù)測B幀;
4.數(shù)據(jù)傳輸:最后將I幀數(shù)據(jù)與預(yù)測的差值信息進行存儲和傳輸。
1.更高的編碼效率:同H.263等標(biāo)準(zhǔn)的特率效率相比,能夠平均節(jié)省大于50%的碼率。
2.高質(zhì)量的視頻畫面:H.264能夠在低碼率情況下提供高質(zhì)量的視頻圖像,在較低帶寬上提供高質(zhì)量的圖像傳輸是H.264的應(yīng)用亮點。
3.提高網(wǎng)絡(luò)適應(yīng)能力:H.264可以工作在實時通信應(yīng)用(如視頻會議)低延時模式下,也可以工作在沒有延時的視頻存儲或視頻流服務(wù)器中。
4.采用混合編碼結(jié)構(gòu):同H.263相同,H.264也使用采用DCT變換編碼加DPCM的差分編碼的混合編碼結(jié)構(gòu),還增加了如多模式運動估計、幀內(nèi)預(yù)測、多幀預(yù)測、基于內(nèi)容的變長編碼、4x4二維整數(shù)變換等新的編碼方式,提高了編碼效率。
5.H.264的編碼選項較少:在H.263中編碼時往往需要設(shè)置相當(dāng)多選項,增加了編碼的難度,而H.264做到了力求簡潔的“回歸基本”,降低了編碼時復(fù)雜度。
6.H.264可以應(yīng)用在不同場合:H.264可以根據(jù)不同的環(huán)境使用不同的傳輸和播放速率,并且提供了豐富的錯誤處理工具,可以很好的控制或消除丟包和誤碼。
7.錯誤恢復(fù)功能:H.264提供了解決網(wǎng)絡(luò)傳輸包丟失的問題的工具,適用于在高誤碼率傳輸?shù)臒o線網(wǎng)絡(luò)中傳輸視頻數(shù)據(jù)。
8.較高的復(fù)雜度:264性能的改進是以增加復(fù)雜性為代價而獲得的。據(jù)估計,H.264編碼的計算復(fù)雜度大約相當(dāng)于H.263的3倍,解碼復(fù)雜度大約相當(dāng)于H.263的2倍。
H.264的目標(biāo)應(yīng)用涵蓋了目前大部分的視頻服務(wù),如有線電視遠(yuǎn)程監(jiān)控、交互媒體、數(shù)字電視、視頻會議、視頻點播、流媒體服務(wù)等。H.264為解決不同應(yīng)用中的網(wǎng)絡(luò)傳輸?shù)牟町?。定義了兩層:視頻編碼層(VCL:Video Coding Layer)負(fù)責(zé)高效的視頻內(nèi)容表示,網(wǎng)絡(luò)提取層(NAL:Network Abstraction Layer)負(fù)責(zé)以網(wǎng)絡(luò)所要求的恰當(dāng)?shù)姆绞綄?shù)據(jù)進行打包和傳送。
ffmpeg常用命令
封裝格式 。
編碼的本質(zhì)就是壓縮數(shù)據(jù)
音頻編碼的作用: 將音頻采樣數(shù)據(jù)( PCM 等)壓縮成音頻碼流,從而降低音頻的數(shù)據(jù)量。 常用的音頻編碼方式有以下幾種:
H264壓縮技術(shù)主要采用了以下幾種方法對視頻數(shù)據(jù)進行壓縮。包括:
經(jīng)過壓縮后的幀分為:I幀,P幀和B幀:
除了I/P/B幀外,還有圖像序列GOP。
組成碼流的結(jié)構(gòu)中,包含了以下幾個部分,從大到小依次是:
H264視頻序列,圖像,片組,片,NALU,宏塊,像素
H264功能分為兩層:
1.H264視頻序列包括一系列的NAL單元,每個NAL單元包含一個RBSP。
2.一個原始的H.264由 N個NALU單元組成
3.NALU單元由[StartCode][NALU Header][NALU Payload]三部分組成
5.NAL Header
由三部分組成forbidden_bit(1bit)(禁止位),nal_reference_bit(2bits)(優(yōu)先級,,值越大,該NAL越重要),nal_unit_type(5bits)(類型)
nal_unit_type
6.NAL的解碼單元的流程如下
所以67實際就是sps
為什么視頻編碼采用YUV而不是rgb
MediaCodec概念
大家可能不太容易明白,我畫了一個圖
如果第二個參數(shù)設(shè)置了surface,那么在釋放的時候releaseOutputBuffer的第二個參數(shù)需要設(shè)置為true
如果第二個參數(shù)設(shè)置為null.那么在釋放的時候releaseOutputBuffer的第二個參數(shù)需要設(shè)置為false
因此我們可以設(shè)置編碼器的初始化
2、找到可用的byeBuffer,并將bytebuffer塞數(shù)據(jù),塞完數(shù)據(jù),需要通知dsp去解碼
使用Android中的StageFright框架調(diào)用OpenMAX進行硬件編碼,OMX部分由硬件廠商實現(xiàn),無需關(guān)注,看好StageFright的調(diào)用方法即可