對一個初學者來說,剛剛接觸音視頻的學習難免會遇到各種個樣的術(shù)語,一開始我也是云里霧里的,到現(xiàn)在一點一點接觸積累,形成一個基本的認識。本文并沒有什么高深和詳細的知識點,旨在記錄一些音視頻中涉及基本概念,以及它們的區(qū)別和聯(lián)系。幫助初學者快速熟悉音視頻開發(fā)。
一. 音視頻處理流程
對音視頻的處理流程可以簡化為下圖步驟:

圖中流程在編碼后有兩種選擇:
- 1.是通過封裝保存為文件,比如錄一段視頻保存為 mp4 文件。
- 2.是直接將數(shù)據(jù)推給流媒體服務(wù)器,接收端可以從流媒體服務(wù)器拉取數(shù)據(jù),比如直播。
圖中的概念解釋如下:
采集
采集就是通過麥克風、攝像頭等途徑采集音頻數(shù)據(jù)和視頻數(shù)據(jù)。
編碼和解碼
由于采集后的數(shù)據(jù)量大且冗余,因此需要進行編碼,編碼就是壓縮。對應(yīng)地,解碼就是就解壓縮。經(jīng)常把編碼和解碼合在一起說為編解碼。編碼和解碼經(jīng)常涉及到的一個問題就是:軟編解(軟件編解碼,軟編/軟解)和硬編解(硬件編解碼,硬編/硬解)。
- 軟編解:通過軟件程序進行編解碼,由 CPU 執(zhí)行程序,性能較低,編解碼后質(zhì)量較高
- 硬編解:通過 GPU 等硬件進行編解碼(GPU 適合做浮點等運算,不適合做邏輯處理),性能高,編解碼后質(zhì)量較低
封裝和解封裝,容器
封裝又叫復用,解封裝又叫解復用。一個視頻文件中,通常包含著音頻數(shù)據(jù)和視頻數(shù)據(jù),即一個視頻文件包含兩路數(shù)據(jù)流,一路視頻流,一路音頻流,有漢英切換的視頻就有兩路音頻流。如何將已經(jīng)編碼壓縮好的視頻數(shù)據(jù)和音頻數(shù)據(jù)按照一定的格式放到一個文件中的過程就叫做封裝。而承載這些數(shù)據(jù)的封裝格式,通常就叫做容器。例如 mp4 容器中有一路 H264 的視頻流和一路 AAC 的音頻流。相反地,從媒體文件或者媒體流中取出視頻數(shù)據(jù)和音頻數(shù)據(jù)的過程就叫做解封裝或者解復用。
渲染
即將解碼后的視頻數(shù)據(jù)還原成圖像,并顯示的過程
二. 圖像
其實音視頻開發(fā)不只有音頻和視頻的處理,對圖像的處理也是一個大的知識點。下面就會介紹一些入門級的圖像相關(guān)的概念。
YUV 和 RGB
YUV 和 RGB 是一種色彩模型(color model),什么是色彩模型呢?就是用一組數(shù)值來描述顏色的抽象數(shù)學模型,常見就是 RGB (三原色), YUV (亮度色度),CMYK (印刷四原色)。它們的區(qū)別在于使用不同的規(guī)則來描述顏色 ,例如 RGB 模型用紅、綠、藍 3 個分量描述顏色,而 YUV 則使用的是亮度(Y)和色度(UV)。
有的地方也把 YUV 和 RGB 說成色彩空間 (color space) , 嚴格來說這種說法是不對的,顏色空間的定義的是顏色的范圍,但是 YUV 和 RGB 表明的并不是一種顏色范圍。對于開發(fā)來說我們只需要知道 YUV 和 RGB 的區(qū)別是對顏色的表示方式不同就足夠了。
像素格式
像素格式描述了像素數(shù)據(jù)存儲所用的格式,定義了像素在內(nèi)存中的編碼方式。
在圖像的存儲過程中,YUV 和 RGB 等通過不同的像素格式來存儲圖像。因此有時候我們說的 YUV , RGB 指的是一種像素格式。
通俗的講,我們知道一張圖像是由許多個像素點組成(像素是指由圖像的小方格組成的,這些小方塊都有一個明確的位置和被分配的色彩數(shù)值),每個像素都包含著顏色信息,以不同的方式來分離這些信息就產(chǎn)生不同的像素格式。例如將顏色信息分為亮度和色度的方式就是 YUV (YUV 也稱 YCbCr , 或 YPbPr , 其中YUV通常用來描述電視的模擬信號,而 YCbCr 則是用來描述數(shù)字的影像信號,但是現(xiàn)在廣泛使用的是 YUV 這種叫法),除此之外,將顏色信息分為紅、綠、藍三顏色的方式就是 RGB 。原本一個像素點的存儲需要 3 個字節(jié),即一個 YUV 分量 或 RGB 分量占一個字節(jié),但在實際使用中為了減少圖像數(shù)據(jù)的尺寸,YUV 和 RGB 有不同的方式來減少存儲的數(shù)據(jù)量,從而產(chǎn)生了多種多樣的 YUV 和 RGB 像素格式。
1. YUVxxx
YUV 通過采樣的方式減少數(shù)據(jù)量。
人眼對色度的敏感程度低于對亮度的敏感程度。利用這個原理,可以把色度信息減少一點,人眼也無法查覺。
例如常見的 YUV444 , YUV422, YUV420 就是對 YUV 三個分量采樣的不同而產(chǎn)生的不同的像素格式。
- YUV444, 以 4 四個像素點為一組,每 4 個 Y 分量就取 4 個 UV 分量,即全采樣,大小為 24bpp (bits per pixel),即 3 字節(jié) * 4 個像素點 * 8bits / 4 個像素點 = 24 bps
- YUV422, 以 4 四個像素點為一組,每 4 個 Y 分量就取 2 個 UV 分量,大小為 16bpp ,全采樣的 2/3 ( ((U+V) * 2+ Y * 4) / ((U+V) * 4 + Y * 4) = 2/3)
-
YUV420, 以 4 四個像素點為一組,每 4 個 Y 分量就取 1 個 UV 分量, 大小為 12bpp ,全采樣的 1/2 ( ((U+V) * 1+ Y * 4) / ((U+V) * 4 + Y * 4) = 1/2)
image.png
跨距 stride
目前 CPU 都是 32 位或者 64 位的,因此讀取一次就是 4 個字節(jié)或者 8 個字節(jié),如果不是 4 個字節(jié)或者 8 個字節(jié)對齊的,就需要額外的工作,比較耗時,因此有時會增加部分數(shù)據(jù),進行內(nèi)存對齊,使之達到 4、8 的倍數(shù)。
跨距 stride 的應(yīng)用就是為了實現(xiàn)內(nèi)存對齊,減少讀取時間,提高效率??缇嗑褪侵笀D像中的一行圖像數(shù)據(jù)所占的存儲空間的長度,它是一個大于等于圖像寬度的內(nèi)存對齊的長度。

存儲格式
YUV 在存儲上按 YUV 三個分量的存儲順序不同可以分為三種格式:
- Planar 平面格式,也稱為三面格式,即 YUV 三個分量分別按順序保存,一個平面存儲一個分量
- Semi-Planar 半平面格式,即兩個平面,一個平面存儲 Y,另外兩個平面存儲 UV 分量。
- Packed 打包格式,只有一個平面,所有亮度(Y)和色度(UV)數(shù)據(jù)都交織在一起。
(1)YU12 ( I420, IYUV )
- 4:2:0:即四個像素點為一組,其中 4 個 Y 分量共一組 UV 分量。一個分量 1 字節(jié),因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 3 Planars
| Y | Y | Y | Y |
|---|---|---|---|
| Y | Y | Y | Y |
| U | U | ||
| V | V |
假設(shè)內(nèi)存對齊為 4 字節(jié),像素寬高為 4 * 2, stride 為大于寬的 4 的倍數(shù)
- Y 平面的 寬為4 , 高為 2 , stride 為 4
- U 平面的 寬為2 , 高為 1 , stride 為 4
- V 平面的 寬為2 , 高為 1 , stride 為 4
(2)YV12
和 YU12 類似,只是改變了 UV 平面的順序。
- 4:2:0:即四個像素點為一組,其中 4 個 Y 分量共一組 UV 分量。一個分量 1 字節(jié),因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 3 Planars
| Y | Y | Y | Y |
|---|---|---|---|
| Y | Y | Y | Y |
| V | V | ||
| U | U |
假設(shè)內(nèi)存對齊為 4 字節(jié),像素寬高為 4 * 2, stride 為大于寬的 4 的倍數(shù)
- Y 平面的 寬為4 , 高為 2 , stride 為 4
- V 平面的 寬為2 , 高為 1 , stride 為 4
- U 平面的 寬為2 , 高為 1 , stride 為 4
(3)NV12
- 4:2:0:即四個像素點為一組,其中 4 個 Y 分量共一組 UV 分量。一個分量 1 字節(jié),因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 2 Planars,兩個平面,分別存儲 Y 分量 和 UV 分量。其中 UV 分量共用一個平面并且以 U, V, U, V 的順序交錯排列。每四個 Y 分量共享一組 UV 分量。
| Y | Y | Y | Y |
|---|---|---|---|
| Y | Y | Y | Y |
| U | V | U | V |
假設(shè)內(nèi)存對齊為 4 字節(jié),像素寬高為 4 * 2, stride 為大于寬的 4 的倍數(shù)
- Y 平面的 寬為4 , 高為 2 , stride 為 4
- UV 平面的 寬為4 , 高為 1 , stride 為 4
NV12 是 iOS 相機可直接輸出的兩種視頻幀格式之一,另外一種是 BGRA32。
(4)NV21
- 4:2:0:即四個像素點為一組,其中 4 個 Y 分量共一組 UV 分量。一個分量 1 字節(jié),因此 6 * 8bits / 4 = 12 Bits per Pixel (bps)
- 12 bps
- 2 Planars,兩個平面,分別存儲 Y 分量 和 UV 分量。其中 UV 分量共用一個平面并且以 V, U, V, U 的順序交錯排列。每四個 Y 分量共享一組 UV 分量。
| Y | Y | Y | Y |
|---|---|---|---|
| Y | Y | Y | Y |
| V | U | V | U |
假設(shè)內(nèi)存對齊為 4 字節(jié),像素寬高為 4 * 2, stride 為大于寬的 4 的倍數(shù)
- Y 平面的 寬為4 , 高為 2 , stride 為 4
- VU 平面的 寬為4 , 高為 1 , stride 為 4
NV21 是 Android 相機默認的格式
2.RGBxxx
RGB 則是對使用的位數(shù)進行縮減
例如常見的 RGB888, RGB565 就是通過減少整個存儲的位數(shù)來減少像素點的存儲大小。
- RGB24, 即 RGB 888, 每個分量用 8bit 來存儲,大小為 24bpp。
- RGB565, 即 R 分量占據(jù) 5 bit ,G 分量占 6 bit,B 分量占 5 bit, 大小為 16 bpp 。
- RGBA, 即在原來的 RGB 分量上多一個 A (Alpha )透明度, 大小為 32 bpp。
3. JPEG 、PNG 和 BMP 等
有了圖像的原始數(shù)據(jù)(YUV 或 RGB 數(shù)據(jù)),有時我們需要將原始數(shù)據(jù)進行存儲,如果不進行壓縮的話,保存圖像需要的空間將十分大。800w 像素的 YUV420 格式數(shù)據(jù)大小為 12M(326424483B*0.5)。不同的壓縮方式就產(chǎn)生了不同的圖片格式,通常這個過程就叫做編碼,將 YUV 數(shù)據(jù)編碼成 JPEG 的意思就是將 YUV 數(shù)據(jù)按 JPEG 的圖像壓縮標準進行壓縮。
原始數(shù)據(jù)的壓縮也叫編碼,將壓縮后的數(shù)據(jù)進行還原就叫做解碼,因此在處理圖像或者視頻涉及到的編解碼實際上就是對原始數(shù)據(jù)的壓縮和對壓縮后的數(shù)據(jù)的還原。編解碼的過程常常由對應(yīng)的編解碼器來完成,不同的編解碼器實現(xiàn)了不同的壓縮還原算法,例如 JPEG 編解碼器就實現(xiàn)了 JPEG 壓縮算法。
(1) JPEG
JPEG 也叫 JPG (因 DOS、Windows 95等早期系統(tǒng)采用的 8.3 命名規(guī)則只支持最長 3 字符的擴展名,為了兼容采用了 .jpg。也因歷史習慣和兼容性考慮,.jpg 目前更流行)
JPEG格式也是應(yīng)用最廣泛的圖片格式之一,它采用一種特殊的有損壓縮算法,將不易被人眼察覺的圖像顏色刪除。
(2) PNG
PNG:采用一種基于 LZ77 派生算法的無損數(shù)據(jù)壓縮。其支持支持透明效果,在圖像邊緣和背景顯得更平滑。
(3) BMP
BMP:Windows系統(tǒng)下的標準位圖格式,未經(jīng)過壓縮,一般圖像文件會比較大。
其他 svg , gif ,webp 等都是圖像的格式,這里就不做展開說明。
三. 音頻
1. 音頻數(shù)據(jù)
(1) 聲音數(shù)據(jù)的由來
聲音實際上是一種聲波,包括我們說話的時候,就是不斷的產(chǎn)生聲波,既然是一種波,就可以在圖上畫出它的波形圖,一個波形圖對應(yīng)的幾個重要參數(shù):振幅,就是這個波形的高度,反映成聲音的話就是聲音越大,這個振幅就越大,波峰也就越高,還有一個就是頻率,對應(yīng)波峰之間的距離,越近頻率就越高,說明聲音的音調(diào)也就越高。

我們處理音頻的時候是直接對音頻做數(shù)據(jù)處理,因此還需要對音頻做數(shù)字化,一般數(shù)字化處理后,進行計算等操作,重新播放的過程可以簡單概括為下面幾個。

關(guān)鍵的地方是模數(shù)的轉(zhuǎn)換和量化編碼,模擬信號轉(zhuǎn)變成數(shù)字信號時涉及到一個采樣的的過程,即相隔一個固定的時間,對模擬信號進行一次采樣,并把信號量化成一個離散的數(shù)字表示。這個采樣的頻率,就是我們說的采樣率,即每秒進行多少次采樣。

(2) 采樣率的確定
采樣率,即每秒進行多少次采樣。
- 根據(jù)奈魁斯特(NYQUIST)采樣定理,用兩倍于一個正弦波的頻率進行采樣就能完全真實地還原該波形。
- 傅立葉原理表明:任何連續(xù)測量的時序或信號,都可以表示為不同頻率的正弦波信號的無限疊加。
- 人的發(fā)聲頻率范圍大概是300Hz~3400Hz,所以,8kHz的采樣率已經(jīng)能夠滿足人們語音通話的需求。
- 由于人耳的聽覺頻率范圍是 20Hz~20kHz(能聽到的聲音的頻率),44.1 kHz 可以重現(xiàn)頻率低于 20 kHz 的所有音頻。
(3) 位深和采樣分辨率
一個采樣點用多少位來表示,位數(shù)越多,所能表示的音頻信號分辨率就越高。采樣聲波時,為每個采樣指定最接近原始聲波振幅的振幅值。較高的位深度可提供更多可能的振幅值,產(chǎn)生更大的動態(tài)范圍、更低的噪聲基準和更高的保真度。目前最常用的是每個采樣點16位。
(3) 聲道
單聲道、立體聲,指的就是這里要講的聲道。聲道是指聲音在錄制或播放時在不同空間位置采集或回放的相互獨立的音頻信號。
通過上面的數(shù)據(jù)即可計算一段音頻裸數(shù)據(jù)的大小
數(shù)據(jù)量(byte)= (采樣頻率(Hz)× 采樣位數(shù)(bit) × 聲道數(shù))x 時間(s)/ 8
2. 音頻格式
(1) PCM
PCM:脈沖編碼調(diào)制,對聲音進行采樣,量化過程,未經(jīng)過任何編碼和壓縮處理的數(shù)據(jù)。因為 PCM 數(shù)據(jù)完整無損,所以 PCM 數(shù)據(jù)音質(zhì)好但是體積大,所以也產(chǎn)生了對音頻壓縮的各種方式。常見的有國際標準化組織 ISO 所提出的 MPEG 系列標準和杜比公司的 AC 系列標準。
有損壓縮和無損壓縮:
有損音頻格式是指經(jīng)過壓縮后產(chǎn)生的新文件所保留的聲音信號,相對于原來的格式的信號而言有所削減的有損壓縮,有損壓縮方法也稱信息量壓縮。這種壓縮方法利用了人類視覺或者人類聽覺對圖像或聲音中的某些頻率成分不敏感的特性,從原始數(shù)據(jù)中將這不敏感的一部分數(shù)據(jù)去除,以達到壓縮的目的。
無損壓縮是指經(jīng)過壓縮后產(chǎn)生的新文件所保留的聲音信號,相對于原來格式的信號完全相同,沒有削減的壓縮是無損壓縮,也稱冗余度壓縮。它利用數(shù)據(jù)的統(tǒng)計冗余進行壓縮,這種壓縮方法從數(shù)學上講是一種可逆運算,還原后和壓縮編碼前的數(shù)據(jù)完全相同。
(2) MP3
MP3 是應(yīng)用于 MPEG-1 的音頻壓縮標準,英文全稱是 MPEG-1 Audio Layer3。
MP3 是利用人耳對高頻聲音信號不敏感的特性,對高頻加大壓縮比,對低頻信號使用小壓縮比,保證信號不失真。 保留能聽到的低頻部分。MP3 是有損壓縮。
(3) AAC
AAC(Advanced Audio Coding),基于 MPEG-2 的音頻編碼技術(shù)。2000年,MPEG-4 標準出現(xiàn)后,AAC 重新集成了其特性,為了區(qū)別于傳統(tǒng)的 MPEG-2 AAC 又稱為 MPEG-4 AAC。AAC 是有損壓縮
(4) WAV
WAV :是是微軟公司專門為 Windows 開發(fā)的一種標準數(shù)字音頻文件,該文件能記錄各種單聲道或立體聲的聲音信息,并能保證聲音不失真。 WAV 是有損壓縮。
四. 視頻
1. 幀
幀是視頻開發(fā)常見的一個基本概念,可以表示為一張畫面,一個段視頻本質(zhì)上就是有許多畫面組成,因此,一個視頻就是由許許多多的視頻幀組成。
在視頻數(shù)據(jù)的壓縮處理中,每幀都代表著一副畫面,由于視頻前后兩幀的畫面極為相似,因此可以通過前一幀的畫面數(shù)據(jù)來進行壓縮或者解壓縮,根據(jù)參考的幀的不同,可以劃分為 I 幀、P 幀 和 B 幀。
- I 幀:(Intra Picture)幀內(nèi)編碼幀,也叫關(guān)鍵幀,I 幀不需要參考其他幀就可以進行解碼。
- P 幀:(Predictive-Frame)向前預測編碼幀,即需要參考前面的一幀才能進行解碼。
- B 幀:(bi-directional interpolated prediction frame)雙向預測內(nèi)插編碼幀,也叫雙向預測幀。即需要參考前面已編碼的幀,又需要參考圖像序列后面的已編碼幀,才能進行解碼。
2. GOP
GOP ,Group of Picture ,指的是兩個 I 幀之間的間隔。
3. PTS 和 DTS
由于存在 B 幀和 P 幀,因此某一幀的解碼順序和顯示順序有可能是不一樣的,因此就有課 PTS 和 DTS 的概念。
- DTS, Decoding TimeStamp 解碼時間戳,用于告訴解碼器什么時候解碼。
- PTS, Presentation TimeStamp 顯示時間戳,用于告訴播放器在什么時候顯示這一幀。

4. 幀率
fps, Frames Per second。每秒顯示的、傳輸?shù)膸瑪?shù)。幀率和視頻流暢度有關(guān),幀率越大視頻越流暢,幀率越小視頻就會卡。通常設(shè)置幀率為 25 fps,因為當幀率大于 24 fps 時,畫面對人眼視覺效果是連續(xù)的。
5. 分辨率
分辨率=畫面水平方向的像素值 * 畫面垂直方向的像素值。常見有1280x720(720P),表示水平方向有 1280 個像素,豎直方向有 720 個像素。對于固定顯示的寬高,分辨率越高,圖像大小越大,越清晰;分辨率越低,圖像大小越小,如果固定寬高大于圖像分辨率,那么圖像就會變模糊。
6. 碼率
bps, Bits per second。指的是每秒傳送的數(shù)據(jù)位數(shù)。常見的單位 kbps (k bits per s) 和 mbps (m bits per s) 。幀率越大,每秒傳輸?shù)膸瑪?shù)越大;分辨率越大,每一幀的內(nèi)容大小越大;因此幀率越大,分辨率越大,碼率就越大。
7. 碼流
流的概念實際上指的就是持續(xù)的視頻數(shù)據(jù)。比如采集后的視頻數(shù)據(jù)流,常稱為裸流,如果是 YUV 格式的,稱為 YUV 流。經(jīng)過 H264 編碼的,稱為 H264 碼流。在視頻流處理中,如果從裸流到 H264 碼流的過程,稱為編碼,反之則稱為解碼。
8.H26x 和 MPEGx
圖像可以壓縮,視頻也不例外。
有了原始數(shù)據(jù) YUV 后,因為視頻前后兩幀圖像由很多相似之處等特點,因此原始視頻數(shù)據(jù)還有很大的壓縮空間,如果不對原始數(shù)據(jù)進行壓縮,那么由這些原始數(shù)據(jù)組成的視頻就很大,自然在網(wǎng)絡(luò)傳輸?shù)臅r候?qū)挼囊缶驮龃?。對此,就產(chǎn)生了不同的視頻壓縮標準,由 ITU(國際電傳視訊聯(lián)盟) 主導制定了 H.26x 系列的視頻壓縮標準;而由 ISO (國際標準組織機構(gòu)) 開發(fā)了 MPEG 系列的視頻標準,后來兩個組織還一起合作制定了一些標準,因此有的時候,雖然是同一個標準但是有不同的名字 H.26x 或者 MPEGx 。兩者的關(guān)系大致如下:
H264 也稱 MPEG-4 ,AVC
H265 也稱 MPEG-H , HEVC

9. 視頻的封裝
一個視頻文件中,通常包含著音頻數(shù)據(jù)和視頻數(shù)據(jù),一個視頻文件包含兩路數(shù)據(jù)流,一路視頻流,一路音頻流,有漢英切換的視頻就有兩路音頻流。如何將已經(jīng)編碼壓縮好的視頻數(shù)據(jù)和音頻數(shù)據(jù)按照一定的格式放到一個文件中的過程就叫做封裝,而承載這些數(shù)據(jù)的封裝格式,通常就叫做容器。例如 mp4 容器中有一路 H264 的視頻流和一路 AAC 的音頻流。常見的視頻封裝格式有 Mp4、Flv 和 AVI 等。
(1) AVI
AVI 英文全稱為 Audio Video Interleaved,即音頻視頻交錯格式,是微軟公司推出的作為其 Windows 視頻軟件一部分的一種容器格式。AVI 文件將音頻和視頻數(shù)據(jù)包含在一個文件容器中,允許音視頻同步回放。
(2) MP4
MP4 英文全稱為 MPEG-4 Part 14,屬于 MPEG-4 的一部分。被認為可以在其中嵌入任何形式的數(shù)據(jù),,不過我們常見的大部分的 MP4 文件存放的 AVC(H.264) 或 MPEG-4(Part 2) 編碼的視頻和 AAC 編碼的音頻。
(3) FLV
FLV 英文全稱為 flash video 。一個 FLV 文件由一個 FLV Header 和 多個 FLV body 組成,一個 FLV body 由 previousTagSize 和 tag 組成,而 tag 則分為 video、audio或者scripts,每個 tag 就包含著音頻或者視頻數(shù)據(jù)。
(4) TS
TS 的全稱則是 Transport Stream,屬于 MPEG2-TS 。MPEG2-TS 格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的。因此常見的 ts 文件都是完整視頻的一個小片段,由所有的 ts 文件組成一個完整的視頻。
10. 流媒體協(xié)議
RTMP、HLS 和 HTTP-FLV 是屬于直播流媒體協(xié)議。
(1) RTMP
RTMP 全稱 Real Time Messaging Protocol,即實時消息傳送協(xié)議。RTMP 是工作在 TCP 之上的協(xié)議,默認使用端口 1935。協(xié)議中的基本數(shù)據(jù)單元成為消息,傳輸?shù)倪^程中消息會被拆分為更小的消息塊。最后將分割后的消息塊通過 TCP 協(xié)議傳輸,接收端再反解接收的消息塊恢復成流媒體數(shù)據(jù)
(2) HLS
HLS 是 Apple 推出的直播協(xié)議,是通過視頻流切片成文件片段來直播的。首先會請求一個m3u8 文件,里面會有不同碼率的流,或者直接是 ts 文件列表,通過給出的 ts 文件地址去依次播放。在直播的時候,會不斷請求 m3u8 文件,檢查 ts 列表是否有新的 ts 切片。
簡單地說 HLS 協(xié)議使用地視頻的封裝格式是 TS。除了 TS 視頻文件本身,還定義了用來控制播放的m3u8 文件(文本文件)。
m3u8 是 Unicode 版本的 M3U,用 UTF-8 編碼?!癿3u” 和 “m3u8” 文件都是 HLS 協(xié)議格式的基礎(chǔ),m3u8 文件實質(zhì)是一個播放列表,其內(nèi)部信息記錄的是一系列媒體片段資源,順序播放該片段資源,即可完整展示多媒體資源,由此可知,整個視頻的總時長就是各個.ts切片資源的時長之和。
HLS 的播放過程時下載的m3u8 內(nèi)容
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
(3) HTTP-FLV
HTTP-FLV 即將流媒體數(shù)據(jù)封裝成 FLV 格式,然后通過 HTTP 協(xié)議傳輸。
其依靠 MIME 的特性,根據(jù)協(xié)議中的 Content-Type 來選擇相應(yīng)的程序去處理相應(yīng)的內(nèi)容,使得流媒體可以通過 HTTP 傳輸。
![歡迎關(guān)注我的微信公眾號【海盜的指針】]
