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

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

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

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

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

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

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

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