1.學(xué)習(xí)音視頻需要一個(gè)非常長(zhǎng)的周期,在這個(gè)周期內(nèi)需要你不斷的強(qiáng)迫自己接受新的知識(shí),并且將某些東西發(fā)揮到極致才會(huì)有所有收貨,下面先簡(jiǎn)單羅列一下接下來(lái)的學(xué)習(xí)過(guò)程
視頻如何解包裝
下面是播放視頻的過(guò)程,至于這個(gè)過(guò)程怎么來(lái)的,大致了解了一下,
一個(gè)可以被播放的視頻,內(nèi)容大致分為3個(gè)
1.音頻 單通道 雙通道 環(huán)繞聲(多通道) 等等
2.視頻數(shù)據(jù)
3.字幕數(shù)據(jù),目前這個(gè)國(guó)內(nèi)用到的比較少
了解了這些就可以繼續(xù)向下分析播放整個(gè)過(guò)程了
視頻播放需要將視頻內(nèi)容拆分

一個(gè)視頻播放需要經(jīng)過(guò)這么多到流程,為什么還要這么做呢
音頻 與 視頻的采集都會(huì)隨著頻率 質(zhì)量影響,設(shè)定的參數(shù)越大就會(huì)導(dǎo)致原始數(shù)據(jù)的內(nèi)容膨脹的非???原始數(shù)據(jù)的膨脹就意味著數(shù)據(jù)傳輸上帶來(lái)的額外的開銷與不穩(wěn)定性,那么就需要對(duì)視頻與音頻進(jìn)行壓縮傳送,現(xiàn)在主流的音頻壓縮大多數(shù)都在使用AAC ,這個(gè)編碼格式在同樣音質(zhì)的情況下,可以將內(nèi)容壓縮的更小,視頻大多都使用的H.264 H.265 格式, 也就是 I P B 幀壓縮思路
視頻的編碼過(guò)程是一個(gè)比較復(fù)雜的過(guò)程,但是如何壓縮視頻呢,我就就從每一幀來(lái)分析
1.空間冗余:通過(guò)算法去除相鄰相似度非常高的內(nèi)容
2.時(shí)間冗余:在視頻拼裝的過(guò)程中,保留第一幀與第二幀之間的變化信息,在播放時(shí)利用完整幀 與 只保留變化幀合成新的幀
3.視覺冗余:某些相似的顏色在人類看起來(lái)是沒(méi)有差別的,或者說(shuō)感受不到差別,那么這類信息統(tǒng)一后,可以讓信息變得更小,在使用方法1,則可以進(jìn)行圖片壓縮,
4.哈夫曼算法能去除編碼信息的冗余
I幀 主要幀 原始圖像 顯示-->在渲染過(guò)程中只需要關(guān)注幀內(nèi)信息 壓縮情況--> 基本沒(méi)有信息壓縮
P幀 變化幀 記錄與I幀的信息差, 顯示-->需要與前面的主要幀合成新的幀圖像 壓縮情況--> 壓縮情況比 I 幀 高,但是比B 幀低
B幀 變化幀 記錄與前面I 幀 和 后面 幀的信息差 , 顯示--> 圖片合成過(guò)程比較復(fù)雜,需要前后兩個(gè)幀都參與進(jìn)來(lái) 壓縮情況-->壓縮率最高
各種壓縮方式也需要結(jié)合實(shí)際情況來(lái)使用,就比如直播業(yè)務(wù)需要較高的數(shù)據(jù)實(shí)時(shí)性與性能的要求,在編碼過(guò)程中就需要盡量減少B幀的數(shù)量,來(lái)減少計(jì)算合成幀的過(guò)程,過(guò)度的壓縮就會(huì)帶來(lái)解碼過(guò)程中性能的損耗,發(fā)熱 電量等其他問(wèn)題也會(huì)隨之出現(xiàn)
現(xiàn)在主流的視頻編碼方式是 H264 與 H265,他們會(huì)有非常多的叫法
H.264 == MPEG-4 AVC 簡(jiǎn)寫 AVC
H.265 == HEVC
H.264 分層結(jié)構(gòu)
VCL: 數(shù)據(jù)編碼層
NAL:網(wǎng)絡(luò)提取層
關(guān)于VCL 與 NAL 的介紹都比較籠統(tǒng),但是把他們想象成 客戶端想服務(wù)端發(fā)起請(qǐng)求的過(guò)程就比較好理解了 VCL 的主要功能就是講 數(shù)據(jù)封裝成一個(gè)javaBean ,而 NAL 則是將javaBean 序列化成為一個(gè) json數(shù)據(jù),發(fā)送給服務(wù)端
視頻信息在傳輸過(guò)程中都是 NALU 的數(shù)據(jù)包來(lái)傳出的,而 NALU 的數(shù)據(jù)包又包含了下面3個(gè)信息
- NALU 間隔符 ,在數(shù)據(jù)傳輸過(guò)程中會(huì)存在非常多的 NALU ,我們使用下面的示例來(lái)看一下
示例1-->NALUNALUNALUNALUNALUNALUNALUNALUNALUNALU
示例2-->|NALU|NALU|NALU|NALU|NALU|NALU|NALU|NALU|
從上面這個(gè)例子就能很好的將一個(gè)個(gè)NALU 數(shù)據(jù)包分割出來(lái)
2.數(shù)據(jù)頭 他是一個(gè)16進(jìn)制的數(shù)據(jù), 將他轉(zhuǎn)換為二進(jìn)制后,有可以將這部分?jǐn)?shù)據(jù)分成了3個(gè)組
0 00 00000
將低 五位轉(zhuǎn)化為 16進(jìn)制后,就可以根據(jù) H.264 信息對(duì)照表來(lái)查看 這個(gè)NALU 數(shù)據(jù)的內(nèi)容 SPS PPS 等信息就是利用它來(lái)區(qū)分的
第2-3位來(lái)表示的是這個(gè)數(shù)據(jù)的重要性 11 代表非常重要 而 00 就代表非常不重要
第一位用來(lái)表示這個(gè)信息是否可用的,0 可用 1不肯用 , 沒(méi)有明白他的設(shè)計(jì)初衷,是為了方便在視頻中夾帶私貨? 搞不清楚
在音視頻開發(fā)領(lǐng)域過(guò)程中,我們需要經(jīng)常分析 SPS PPS 與 I幀
而且伴隨著 B 幀的內(nèi)容是與 前后幀都有關(guān)系的,那么在實(shí)際開發(fā)過(guò)程中 就產(chǎn)生了2個(gè)順序,也就是 解碼順序與播放數(shù)據(jù) ,這個(gè)概念也是非常重要的