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