對一個初學者來說祭刚,剛剛接觸音視頻的學習難免會遇到各種個樣的術語,一開始我也是云里霧里的耐齐,到現在一點一點接觸積累羡蛾,形成一個基本的認識。本文并沒有什么高深和詳細的知識點眷茁,旨在記錄一些音視頻中涉及基本概念炕泳,以及它們的區(qū)別和聯系。幫助初學者快速熟悉音視頻開發(fā)上祈。
一. 音視頻處理流程
對音視頻的處理流程可以簡化為下圖步驟:
圖中流程在編碼后有兩種選擇:
- 1.是通過封裝保存為文件培遵,比如錄一段視頻保存為 mp4 文件。
- 2.是直接將數據推給流媒體服務器登刺,接收端可以從流媒體服務器拉取數據籽腕,比如直播。
圖中的概念解釋如下:
采集
采集就是通過麥克風纸俭、攝像頭等途徑采集音頻數據和視頻數據皇耗。
編碼和解碼
由于采集后的數據量大且冗余,因此需要進行編碼掉蔬,編碼就是壓縮廊宪。對應地,解碼就是就解壓縮女轿。經常把編碼和解碼合在一起說為編解碼箭启。編碼和解碼經常涉及到的一個問題就是:軟編解(軟件編解碼,軟編/軟解)和硬編解(硬件編解碼蛉迹,硬編/硬解)傅寡。
- 軟編解:通過軟件程序進行編解碼,由 CPU 執(zhí)行程序北救,性能較低荐操,編解碼后質量較高
- 硬編解:通過 GPU 等硬件進行編解碼(GPU 適合做浮點等運算,不適合做邏輯處理)珍策,性能高托启,編解碼后質量較低
封裝和解封裝,容器
封裝又叫復用攘宙,解封裝又叫解復用屯耸。一個視頻文件中拐迁,通常包含著音頻數據和視頻數據,即一個視頻文件包含兩路數據流疗绣,一路視頻流线召,一路音頻流,有漢英切換的視頻就有兩路音頻流多矮。如何將已經編碼壓縮好的視頻數據和音頻數據按照一定的格式放到一個文件中的過程就叫做封裝缓淹。而承載這些數據的封裝格式,通常就叫做容器塔逃。例如 mp4 容器中有一路 H264 的視頻流和一路 AAC 的音頻流讯壶。相反地,從媒體文件或者媒體流中取出視頻數據和音頻數據的過程就叫做解封裝或者解復用湾盗。
渲染
即將解碼后的視頻數據還原成圖像鹏溯,并顯示的過程
二. 圖像
其實音視頻開發(fā)不只有音頻和視頻的處理,對圖像的處理也是一個大的知識點淹仑。下面就會介紹一些入門級的圖像相關的概念丙挽。
YUV 和 RGB
YUV 和 RGB 是一種色彩模型(color model),什么是色彩模型呢?就是用一組數值來描述顏色的抽象數學模型匀借,常見就是 RGB (三原色)颜阐, YUV (亮度色度),CMYK (印刷四原色)吓肋。它們的區(qū)別在于使用不同的規(guī)則來描述顏色 凳怨,例如 RGB 模型用紅、綠是鬼、藍 3 個分量描述顏色肤舞,而 YUV 則使用的是亮度(Y)和色度(UV)。
有的地方也把 YUV 和 RGB 說成色彩空間 (color space) , 嚴格來說這種說法是不對的均蜜,顏色空間的定義的是顏色的范圍李剖,但是 YUV 和 RGB 表明的并不是一種顏色范圍。對于開發(fā)來說我們只需要知道 YUV 和 RGB 的區(qū)別是對顏色的表示方式不同就足夠了囤耳。
像素格式
像素格式描述了像素數據存儲所用的格式篙顺,定義了像素在內存中的編碼方式。
在圖像的存儲過程中充择,YUV 和 RGB 等通過不同的像素格式來存儲圖像德玫。因此有時候我們說的 YUV , RGB 指的是一種像素格式椎麦。
通俗的講宰僧,我們知道一張圖像是由許多個像素點組成(像素是指由圖像的小方格組成的,這些小方塊都有一個明確的位置和被分配的色彩數值)观挎,每個像素都包含著顏色信息琴儿,以不同的方式來分離這些信息就產生不同的像素格式查刻。例如將顏色信息分為亮度和色度的方式就是 YUV (YUV 也稱 YCbCr , 或 YPbPr , 其中YUV通常用來描述電視的模擬信號,而 YCbCr 則是用來描述數字的影像信號,但是現在廣泛使用的是 YUV 這種叫法)凤类,除此之外,將顏色信息分為紅普气、綠谜疤、藍三顏色的方式就是 RGB 。原本一個像素點的存儲需要 3 個字節(jié)现诀,即一個 YUV 分量 或 RGB 分量占一個字節(jié)夷磕,但在實際使用中為了減少圖像數據的尺寸,YUV 和 RGB 有不同的方式來減少存儲的數據量仔沿,從而產生了多種多樣的 YUV 和 RGB 像素格式坐桩。
1. YUVxxx
YUV 通過采樣的方式減少數據量。
人眼對色度的敏感程度低于對亮度的敏感程度封锉。利用這個原理绵跷,可以把色度信息減少一點,人眼也無法查覺成福。
例如常見的 YUV444 , YUV422, YUV420 就是對 YUV 三個分量采樣的不同而產生的不同的像素格式碾局。
- 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)
跨距 stride
目前 CPU 都是 32 位或者 64 位的潭苞,因此讀取一次就是 4 個字節(jié)或者 8 個字節(jié)忽冻,如果不是 4 個字節(jié)或者 8 個字節(jié)對齊的,就需要額外的工作此疹,比較耗時甚颂,因此有時會增加部分數據,進行內存對齊秀菱,使之達到 4振诬、8 的倍數。
跨距 stride 的應用就是為了實現內存對齊衍菱,減少讀取時間赶么,提高效率〖勾跨距就是指圖像中的一行圖像數據所占的存儲空間的長度辫呻,它是一個大于等于圖像寬度的內存對齊的長度清钥。
存儲格式
YUV 在存儲上按 YUV 三個分量的存儲順序不同可以分為三種格式:
- Planar 平面格式,也稱為三面格式放闺,即 YUV 三個分量分別按順序保存祟昭,一個平面存儲一個分量
- Semi-Planar 半平面格式,即兩個平面怖侦,一個平面存儲 Y篡悟,另外兩個平面存儲 UV 分量。
- Packed 打包格式匾寝,只有一個平面搬葬,所有亮度(Y)和色度(UV)數據都交織在一起。
(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 |
假設內存對齊為 4 字節(jié)猜年,像素寬高為 4 * 2, stride 為大于寬的 4 的倍數
- 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 |
假設內存對齊為 4 字節(jié)袁稽,像素寬高為 4 * 2, stride 為大于寬的 4 的倍數
- 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 |
假設內存對齊為 4 字節(jié)暖夭,像素寬高為 4 * 2, stride 為大于寬的 4 的倍數
- 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 |
假設內存對齊為 4 字節(jié)影钉,像素寬高為 4 * 2, stride 為大于寬的 4 的倍數
- Y 平面的 寬為4 , 高為 2 , stride 為 4
- VU 平面的 寬為4 , 高為 1 , stride 為 4
NV21 是 Android 相機默認的格式
2.RGBxxx
RGB 則是對使用的位數進行縮減
例如常見的 RGB888, RGB565 就是通過減少整個存儲的位數來減少像素點的存儲大小。
- RGB24, 即 RGB 888, 每個分量用 8bit 來存儲掘剪,大小為 24bpp平委。
- RGB565, 即 R 分量占據 5 bit ,G 分量占 6 bit夺谁,B 分量占 5 bit, 大小為 16 bpp 廉赔。
- RGBA, 即在原來的 RGB 分量上多一個 A (Alpha )透明度, 大小為 32 bpp。
3. JPEG 予权、PNG 和 BMP 等
有了圖像的原始數據(YUV 或 RGB 數據),有時我們需要將原始數據進行存儲浪册,如果不進行壓縮的話扫腺,保存圖像需要的空間將十分大。800w 像素的 YUV420 格式數據大小為 12M(326424483B*0.5)村象。不同的壓縮方式就產生了不同的圖片格式笆环,通常這個過程就叫做編碼,將 YUV 數據編碼成 JPEG 的意思就是將 YUV 數據按 JPEG 的圖像壓縮標準進行壓縮厚者。
原始數據的壓縮也叫編碼躁劣,將壓縮后的數據進行還原就叫做解碼,因此在處理圖像或者視頻涉及到的編解碼實際上就是對原始數據的壓縮和對壓縮后的數據的還原库菲。編解碼的過程常常由對應的編解碼器來完成账忘,不同的編解碼器實現了不同的壓縮還原算法,例如 JPEG 編解碼器就實現了 JPEG 壓縮算法熙宇。
(1) JPEG
JPEG 也叫 JPG (因 DOS鳖擒、Windows 95等早期系統(tǒng)采用的 8.3 命名規(guī)則只支持最長 3 字符的擴展名,為了兼容采用了 .jpg烫止。也因歷史習慣和兼容性考慮蒋荚,.jpg 目前更流行)
JPEG格式也是應用最廣泛的圖片格式之一,它采用一種特殊的有損壓縮算法馆蠕,將不易被人眼察覺的圖像顏色刪除期升。
(2) PNG
PNG:采用一種基于 LZ77 派生算法的無損數據壓縮。其支持支持透明效果互躬,在圖像邊緣和背景顯得更平滑播赁。
(3) BMP
BMP:Windows系統(tǒng)下的標準位圖格式,未經過壓縮,一般圖像文件會比較大吼渡。
其他 svg , gif ,webp 等都是圖像的格式行拢,這里就不做展開說明。
三. 音頻
1. 音頻數據
(1) 聲音數據的由來
聲音實際上是一種聲波,包括我們說話的時候舟奠,就是不斷的產生聲波竭缝,既然是一種波,就可以在圖上畫出它的波形圖沼瘫,一個波形圖對應的幾個重要參數:振幅抬纸,就是這個波形的高度,反映成聲音的話就是聲音越大耿戚,這個振幅就越大湿故,波峰也就越高,還有一個就是頻率膜蛔,對應波峰之間的距離坛猪,越近頻率就越高,說明聲音的音調也就越高皂股。
我們處理音頻的時候是直接對音頻做數據處理墅茉,因此還需要對音頻做數字化,一般數字化處理后呜呐,進行計算等操作就斤,重新播放的過程可以簡單概括為下面幾個。
關鍵的地方是模數的轉換和量化編碼蘑辑,模擬信號轉變成數字信號時涉及到一個采樣的的過程洋机,即相隔一個固定的時間,對模擬信號進行一次采樣洋魂,并把信號量化成一個離散的數字表示绷旗。這個采樣的頻率,就是我們說的采樣率副砍,即每秒進行多少次采樣刁标。
(2) 采樣率的確定
采樣率,即每秒進行多少次采樣址晕。
- 根據奈魁斯特(NYQUIST)采樣定理膀懈,用兩倍于一個正弦波的頻率進行采樣就能完全真實地還原該波形。
- 傅立葉原理表明:任何連續(xù)測量的時序或信號谨垃,都可以表示為不同頻率的正弦波信號的無限疊加启搂。
- 人的發(fā)聲頻率范圍大概是300Hz~3400Hz,所以刘陶,8kHz的采樣率已經能夠滿足人們語音通話的需求胳赌。
- 由于人耳的聽覺頻率范圍是 20Hz~20kHz(能聽到的聲音的頻率),44.1 kHz 可以重現頻率低于 20 kHz 的所有音頻匙隔。
(3) 位深和采樣分辨率
一個采樣點用多少位來表示疑苫,位數越多,所能表示的音頻信號分辨率就越高。采樣聲波時捍掺,為每個采樣指定最接近原始聲波振幅的振幅值撼短。較高的位深度可提供更多可能的振幅值,產生更大的動態(tài)范圍挺勿、更低的噪聲基準和更高的保真度曲横。目前最常用的是每個采樣點16位。
(3) 聲道
單聲道不瓶、立體聲禾嫉,指的就是這里要講的聲道。聲道是指聲音在錄制或播放時在不同空間位置采集或回放的相互獨立的音頻信號蚊丐。
通過上面的數據即可計算一段音頻裸數據的大小
數據量(byte)= (采樣頻率(Hz)× 采樣位數(bit) × 聲道數)x 時間(s)/ 8
2. 音頻格式
(1) PCM
PCM:脈沖編碼調制熙参,對聲音進行采樣,量化過程麦备,未經過任何編碼和壓縮處理的數據孽椰。因為 PCM 數據完整無損,所以 PCM 數據音質好但是體積大泥兰,所以也產生了對音頻壓縮的各種方式弄屡。常見的有國際標準化組織 ISO 所提出的 MPEG 系列標準和杜比公司的 AC 系列標準题禀。
有損壓縮和無損壓縮:
有損音頻格式是指經過壓縮后產生的新文件所保留的聲音信號鞋诗,相對于原來的格式的信號而言有所削減的有損壓縮,有損壓縮方法也稱信息量壓縮迈嘹。這種壓縮方法利用了人類視覺或者人類聽覺對圖像或聲音中的某些頻率成分不敏感的特性削彬,從原始數據中將這不敏感的一部分數據去除,以達到壓縮的目的秀仲。
無損壓縮是指經過壓縮后產生的新文件所保留的聲音信號融痛,相對于原來格式的信號完全相同,沒有削減的壓縮是無損壓縮神僵,也稱冗余度壓縮雁刷。它利用數據的統(tǒng)計冗余進行壓縮,這種壓縮方法從數學上講是一種可逆運算保礼,還原后和壓縮編碼前的數據完全相同沛励。
(2) MP3
MP3 是應用于 MPEG-1 的音頻壓縮標準,英文全稱是 MPEG-1 Audio Layer3炮障。
MP3 是利用人耳對高頻聲音信號不敏感的特性目派,對高頻加大壓縮比,對低頻信號使用小壓縮比胁赢,保證信號不失真企蹭。 保留能聽到的低頻部分。MP3 是有損壓縮。
(3) AAC
AAC(Advanced Audio Coding)谅摄,基于 MPEG-2 的音頻編碼技術徒河。2000年,MPEG-4 標準出現后螟凭,AAC 重新集成了其特性虚青,為了區(qū)別于傳統(tǒng)的 MPEG-2 AAC 又稱為 MPEG-4 AAC。AAC 是有損壓縮
(4) WAV
WAV :是是微軟公司專門為 Windows 開發(fā)的一種標準數字音頻文件螺男,該文件能記錄各種單聲道或立體聲的聲音信息棒厘,并能保證聲音不失真。 WAV 是有損壓縮下隧。
四. 視頻
1. 幀
幀是視頻開發(fā)常見的一個基本概念奢人,可以表示為一張畫面,一個段視頻本質上就是有許多畫面組成淆院,因此何乎,一個視頻就是由許許多多的視頻幀組成。
在視頻數據的壓縮處理中土辩,每幀都代表著一副畫面支救,由于視頻前后兩幀的畫面極為相似,因此可以通過前一幀的畫面數據來進行壓縮或者解壓縮拷淘,根據參考的幀的不同各墨,可以劃分為 I 幀、P 幀 和 B 幀启涯。
- I 幀:(Intra Picture)幀內編碼幀贬堵,也叫關鍵幀,I 幀不需要參考其他幀就可以進行解碼结洼。
- P 幀:(Predictive-Frame)向前預測編碼幀黎做,即需要參考前面的一幀才能進行解碼。
- B 幀:(bi-directional interpolated prediction frame)雙向預測內插編碼幀松忍,也叫雙向預測幀蒸殿。即需要參考前面已編碼的幀,又需要參考圖像序列后面的已編碼幀鸣峭,才能進行解碼宏所。
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。每秒顯示的听隐、傳輸的幀數补鼻。幀率和視頻流暢度有關,幀率越大視頻越流暢雅任,幀率越小視頻就會卡风范。通常設置幀率為 25 fps,因為當幀率大于 24 fps 時,畫面對人眼視覺效果是連續(xù)的沪么。
5. 分辨率
分辨率=畫面水平方向的像素值 * 畫面垂直方向的像素值硼婿。常見有1280x720(720P),表示水平方向有 1280 個像素禽车,豎直方向有 720 個像素寇漫。對于固定顯示的寬高,分辨率越高殉摔,圖像大小越大州胳,越清晰;分辨率越低逸月,圖像大小越小栓撞,如果固定寬高大于圖像分辨率,那么圖像就會變模糊彻采。
6. 碼率
bps, Bits per second腐缤。指的是每秒傳送的數據位數捌归。常見的單位 kbps (k bits per s) 和 mbps (m bits per s) 肛响。幀率越大,每秒傳輸的幀數越大惜索;分辨率越大特笋,每一幀的內容大小越大;因此幀率越大巾兆,分辨率越大猎物,碼率就越大。
7. 碼流
流的概念實際上指的就是持續(xù)的視頻數據角塑。比如采集后的視頻數據流蔫磨,常稱為裸流,如果是 YUV 格式的圃伶,稱為 YUV 流堤如。經過 H264 編碼的蒲列,稱為 H264 碼流。在視頻流處理中搀罢,如果從裸流到 H264 碼流的過程蝗岖,稱為編碼,反之則稱為解碼榔至。
8.H26x 和 MPEGx
圖像可以壓縮抵赢,視頻也不例外。
有了原始數據 YUV 后唧取,因為視頻前后兩幀圖像由很多相似之處等特點铅鲤,因此原始視頻數據還有很大的壓縮空間,如果不對原始數據進行壓縮枫弟,那么由這些原始數據組成的視頻就很大彩匕,自然在網絡傳輸的時候對帶寬的要求就增大。對此媒区,就產生了不同的視頻壓縮標準驼仪,由 ITU(國際電傳視訊聯盟) 主導制定了 H.26x 系列的視頻壓縮標準;而由 ISO (國際標準組織機構) 開發(fā)了 MPEG 系列的視頻標準袜漩,后來兩個組織還一起合作制定了一些標準绪爸,因此有的時候,雖然是同一個標準但是有不同的名字 H.26x 或者 MPEGx 宙攻。兩者的關系大致如下:
H264 也稱 MPEG-4 奠货,AVC
H265 也稱 MPEG-H , HEVC
9. 視頻的封裝
一個視頻文件中,通常包含著音頻數據和視頻數據座掘,一個視頻文件包含兩路數據流递惋,一路視頻流,一路音頻流溢陪,有漢英切換的視頻就有兩路音頻流萍虽。如何將已經編碼壓縮好的視頻數據和音頻數據按照一定的格式放到一個文件中的過程就叫做封裝,而承載這些數據的封裝格式形真,通常就叫做容器杉编。例如 mp4 容器中有一路 H264 的視頻流和一路 AAC 的音頻流。常見的視頻封裝格式有 Mp4咆霜、Flv 和 AVI 等邓馒。
(1) AVI
AVI 英文全稱為 Audio Video Interleaved,即音頻視頻交錯格式蛾坯,是微軟公司推出的作為其 Windows 視頻軟件一部分的一種容器格式光酣。AVI 文件將音頻和視頻數據包含在一個文件容器中,允許音視頻同步回放脉课。
(2) MP4
MP4 英文全稱為 MPEG-4 Part 14,屬于 MPEG-4 的一部分救军。被認為可以在其中嵌入任何形式的數據改览,,不過我們常見的大部分的 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 就包含著音頻或者視頻數據跌穗。
(4) TS
TS 的全稱則是 Transport Stream订晌,屬于 MPEG2-TS 。MPEG2-TS 格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的蚌吸。因此常見的 ts 文件都是完整視頻的一個小片段锈拨,由所有的 ts 文件組成一個完整的視頻。
10. 流媒體協議
RTMP羹唠、HLS 和 HTTP-FLV 是屬于直播流媒體協議奕枢。
(1) RTMP
RTMP 全稱 Real Time Messaging Protocol,即實時消息傳送協議佩微。RTMP 是工作在 TCP 之上的協議缝彬,默認使用端口 1935。協議中的基本數據單元成為消息哺眯,傳輸的過程中消息會被拆分為更小的消息塊谷浅。最后將分割后的消息塊通過 TCP 協議傳輸,接收端再反解接收的消息塊恢復成流媒體數據
(2) HLS
HLS 是 Apple 推出的直播協議奶卓,是通過視頻流切片成文件片段來直播的一疯。首先會請求一個m3u8 文件,里面會有不同碼率的流夺姑,或者直接是 ts 文件列表墩邀,通過給出的 ts 文件地址去依次播放。在直播的時候瑟幕,會不斷請求 m3u8 文件磕蒲,檢查 ts 列表是否有新的 ts 切片留潦。
簡單地說 HLS 協議使用地視頻的封裝格式是 TS只盹。除了 TS 視頻文件本身,還定義了用來控制播放的m3u8 文件(文本文件)兔院。
m3u8 是 Unicode 版本的 M3U殖卑,用 UTF-8 編碼》宦埽“m3u” 和 “m3u8” 文件都是 HLS 協議格式的基礎孵稽,m3u8 文件實質是一個播放列表许起,其內部信息記錄的是一系列媒體片段資源,順序播放該片段資源菩鲜,即可完整展示多媒體資源园细,由此可知,整個視頻的總時長就是各個.ts切片資源的時長之和接校。
HLS 的播放過程時下載的m3u8 內容
#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 即將流媒體數據封裝成 FLV 格式猛频,然后通過 HTTP 協議傳輸。
其依靠 MIME 的特性蛛勉,根據協議中的 Content-Type 來選擇相應的程序去處理相應的內容鹿寻,使得流媒體可以通過 HTTP 傳輸。
![歡迎關注我的微信公眾號【海盜的指針】]