概述
流媒體,指使用流式傳輸技術在網絡上實時連續播放的媒體格式,如音頻、視頻等多媒體文件。對於流媒體相關開發來說,無外乎是對音視頻的采集、渲染、處理和輸出。而音視頻則是流媒體的核心。本文將對音視頻中的一些術語名詞等進行簡要介紹。
1、音視頻組成
我們常見的視頻文件如mp4,flv,avi,rmvb等視頻文件,可以看成是一個容器。我們常說的視頻格式,指容器格式。這些容器封裝了音頻、視頻和基礎元信息(Meta Data)等。而容器里封裝的音視頻也是經過不同的編碼格式壓縮過的。例如,一個經過H264視頻編碼后的文件和一個MP3音頻編碼文件按AVI封裝標准封裝后就得到一個AVI后綴的視頻文件。
2、視頻容器格式
MP4
ISO和IEC兩個組織下屬的MPEG(動態圖像專家組)制定的格式。非常開放,幾乎可以描述所有媒體結構。支持流媒體,被廣泛用於H.264和H.265視頻和ACC音頻,高清視頻常用格式。
AVI
Audio Video Interleaved,微軟對抗蘋果QuickTime的產物。可跨平台使用,但體積龐大,亞索標准不統一。
FLV
Flash Video,目前最流行的流媒體格式,文件體積小,封裝播放簡單,非常適合在網絡場景下使用,常用於各大視頻網站。
WebM
谷歌退出的轉為Web設計的開放媒體文件格式。包含使用VP8或VP9視頻編解碼器壓縮的視頻流和用Vorbis或Opus音頻編解碼器壓縮的音頻流。
MOV
QuickTime中常見格式,兼容性強。
3、視頻編碼格式
- Xvid(MPEG4)
- H264
- H263
- MPEG1,MPEG2
- AC-1
- RM,RMVB
- H265
目前最常用的編碼格式基本是H264,優點是低碼率,高質量,容錯能力強,網絡適應性強。
H265目前使用還不多,它是用來替代H264的標准,支持更高分辨率,但瀏覽器支持較差。
4、音頻編碼格式
- AAC
- AMR
- PCM
- OGG
- AC3
- DTS
- APE
- AU
- WMA
目前最常見的音頻格式是MP3和ACC,ACC的編碼方案對比MP3優勢更大。
5、視頻碼率、幀率、分辨率
碼率
碼率、碼流、比特率是一個東西,又稱二進制位速率。單位bit/s或bps,kbps,Mbps等。碼率是視頻編碼中畫面質量控制中最重要的部分,通常同分辨率下,碼率越大,壓縮比就越小,畫面質量就越高。碼率越高,代表單位時間采樣率越大,數據精度高,越接近原始文件,畫質更清晰,但對播放設備的解碼能力要求也就越高,文件體積也越大。
文件體積 = 時間 * 碼率 / 8
例如,一部90分鍾1Mbps碼率的720P RMVB文件,它的體積是5400 * 1 / 8 = 675MB。
通常,一個視頻文件包括視頻和音頻,視頻和音頻都有各自不同的采樣方式和比特率。而我們常說的一個視頻文件的碼率大小,一般是指視頻文件里音視頻碼率的和。
幀率
FPS(Frames Per Second),和游戲中的FPS一個概念。高幀率可以得到更流暢的效果。幀率越高,對CPU消耗也越大。
通常普通視頻15-20fps,電影常用24fps。由於人眼視覺暫留效應,一般超過12fps就可以認為流暢(僅對視頻而言)
分辨率
視頻中圖像的尺寸大小。例如720P是1280*720個像素點,1080P是1920*1080個像素點。
6、圖像存儲,RGB和YUV
視頻由一張張圖片組成,視頻的文件大小也直接受圖片大小和數量影響。那么影響一張圖片大小的因素有哪些?這就需要了解色彩空間和圖像編碼。
RGB
RGB是我們非常熟悉的一種顏色空間。RGB模型使用三原色亮度來定量表示顏色,這是一種加色混色模型,適用於顯示器等發光體的顯示,幾乎人眼所能看到的所有顏色都可以用RGB表示。傳統RGB三原色表示一個像素,每種原色占用一個字節,一個像素則需要3字節。
YUV
YUV(又稱YCrCb)是被歐洲電視系統采用的一種顏色編碼方法,和RGB區別很大。YUV模型根據一個亮度分量Y和兩個色度分量UV(分別表示色調和飽和度)來定義顏色。它最大的優點在於只需要占用極少的帶寬(RGB要求三個獨立的視頻信號同時傳輸),同時由於Y和UV是分離的,當只有Y分量時表現的圖像就是黑白灰度圖像,這樣完成了彩色電視機和黑白電視機的兼容問題,黑白電視得以接收彩色電視信號。
YUV格式分為兩大類:planar和packed。planar是先連續存儲所有像素點的Y,緊接着存儲所有像素點的U,隨后是所有像素點的V。而packed格式則交替存儲每個像素點的YUV分量。
YUV常見的幾種編碼格式有YUV444,422,420和411,其中YUV420最常用。它們的含義如下。
- YUV444:YUV三個分量采樣率相同,每個像素的三個分量信息完整,一個像素占用3字節。
- YUV422:每兩個Y分量公用一個UV分量,一個像素占用2字節。
- YUV420:每四個Y分量公用一個UV分量,一個像素占用1.5字節。
- YUV411:每四個Y分量公用一個UV分量,一個像素占用1.5字節。
通過對YUV分量比例和排列順序和位置的不同,實際上可以分為很多種格式,例如安卓相機默認圖像格式屬於YUV420SP。但顯而易見,YUV帶來的好處很多,通過減少UV分量可以顯著減少每個像素占用的空間,這是因為人眼對色度的敏感程度低於對亮度的敏感程度。相對於RGB而言YUV編碼可以節省很大空間。
一幅圖像大小
一張圖像所占字節大小 = 分辨率 * 二進制顏色位數 / 8
其中二進制顏色位數由色彩編碼格式決定。例如RGB24的量化位數是24位,RGB32是32位,YUV420是12位。也可以直接轉化為字節計算,例如一幀1024*768分辨率采用YUV422編碼的圖像數據流大小為1024*768*2=1572864字節,就是1.5MB大小。
7、音頻采樣
聲是一種波,頻率決定音調,振幅決定音量。對音頻的采樣就是對波的采樣,即記錄波弦上的點。波是無限光滑的,顯然不可能記錄波上所有的點。因此采樣就牽涉到采樣頻率和采樣精度。如果你對HIFI感興趣,可能知道常用采樣頻率22.05KHz,44.1KHz,48KHz甚至96KHz和192KHz;而采樣精度通常有16bit或24bit。采樣頻率越高,精度越大,對聲音的記錄就越真實。
人耳能聽到的聲音頻率范圍是20Hz-20KHz,根據奈奎斯特采樣原理,按比聲音最高頻率高兩倍以上的頻率對聲音采樣,一般采樣率就是44.1KHz,即1秒鍾內采樣44100次。采樣精度則類似於圖片中的圖片深度。如果用笛卡爾直角坐標系表示一個聲波,采樣頻率對應橫軸精度,采樣精度對應縱軸精度。顯然對音頻是不可能完全真實記錄的,就像無法用有限數字表達圓周率一樣,但可以做到非常接近,被稱為高保真,這也是HIFI里非常重要的概念。現實中,能達到最高保真水平的就是PCM編碼,約定俗成稱之為無損編碼,但這種無損只是相對的。而MP3,ACC相對就稱為有損格式。
碼率(bps)=采樣頻率*采樣精度*聲道數
對於一個PCM音頻流來說碼率比較容易算。一個采樣率44.1KHz,采樣精度16bit,雙聲道的PCM編碼的WAV文件,碼率是44.1k*16*2=1411.2kbps,即碼率。碼率/8得到176KB/s,表示每秒傳輸數據帶寬。這樣一分鍾音樂大概需要10.34MB,這對很多用戶是不可接受的,所以有了各種壓縮方案。
8、IBP幀,IDR幀和GOP
I幀
I幀即關鍵幀,可以看作一幀畫面的完整保留,壓縮比和JPEG差不多,I幀的壓縮可以去掉空間的冗余信息。
- 是一個全幀壓縮編碼幀。它把全幀圖像信息進行JPEG壓縮編碼及傳輸
- 解碼時僅用I幀數據就可以重構完整圖像
- I幀描述了圖像背景和運動主體的詳情
- I幀不需要參考其他畫面生成
- I幀是P幀和B幀的參考幀,它的質量直接影響到同組里以后各幀質量
- I幀是幀組GOP的基礎幀(第一幀),一組中只有一個I幀
- I幀不需要考慮運動矢量
- I幀所占數據信息量比較大
P幀
P幀(predictive-frame):前向預測編碼幀(預測幀)。通過將低於圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數據量的編碼幀,是以I幀為參考幀,在I幀中找到P幀‘某點’的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出‘某點’預測值並與差值相加得到P幀‘某點’樣值,從而得到完整的P幀。
- P幀是I幀后相隔1-2幀的編碼幀
- P幀使用運動補償方法傳送它與前面的I或P幀的差值和運動矢量
- 解碼時必須將I幀中的預測值和預測誤差求和后才能重構完整的P幀圖像
- P幀屬於前向預測的幀間編碼,它只參考前面最靠近它的I幀或P幀
- P幀可以是其后面P幀的參考幀,也可以是其前后B幀的參考幀
- P幀是參考幀,它可能造成解碼錯誤的擴散
- 由於是差值傳送,P幀壓縮比較高
B幀
B幀(bi-directional interpolated prediction frame):雙向預測內插編碼幀(雙向預測幀),既考慮與源圖像序列前面已編碼幀,也顧及圖像序列后面已編碼幀間的時間冗余信息來壓縮傳輸數據量的編碼幀,是以前面的I或P幀和后面的P幀為參考幀,找出B幀中某點預測值和兩個運動矢量,並取預測值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中算出預測值並與差值求和,得到B幀某點樣值,從而得到完整B幀。
- B幀由前面的I或P和后面的P來預測
- B幀傳送的是它和前面的I或P和后面的P幀間的預測誤差和運動矢量
- B幀是雙向預測編碼幀
- B幀壓縮比最高,預測比較准確
- B幀不是參考幀,不會造成編碼錯誤的擴散
- 運算量多,因此對硬件要求高
IDR幀
IDR(Instantaneous Decoding Refresh):即時解碼刷新。I幀和IDR幀都是使用幀內預測的,它們都是同一個東西,在編解碼中為了方便,將首個I幀和其他I幀區別開,就把第一個I幀稱為IDR。作用是立刻刷新,使錯誤不至於傳播,從IDR開始重新算一個新的序列進行編碼。對IDR幀來說,它之后的所有幀都不能引用任何它之前的幀內容。播放器永遠可以從一個IDR幀播放,因為它后邊沒有任何幀引用之前的幀。
DTS
Decode Time Stamp,解碼時間戳,標識讀入內存中的bit流什么時候開始送到解碼器里進行解碼,在解碼階段使用。
PTS
Presentation Time Stamp,用於度量解碼后的視頻幀什么時候顯示出來,主要用於視音頻的同步和輸出。
GOP
Group Of Picture,是兩個I幀間形成的一組圖片。可以設置兩個I幀之間的幀數量。
一般來說,I幀壓縮略是7,和JPG差不多;P是20;B可以達到50。所以B幀可以節省大量空間,節省出的空間可以用來多保存一些I幀,這樣在相同碼率下可以提供更好的畫質。在碼率不變的前提下GOP值越大,P、B幀數量越多,平均每個I、P、B幀所占字節數就越多,也更容易獲取較好的圖像質量。
如果一個GOP里丟失了I幀,那么后面的PB幀就沒用了,必須丟掉。但TCP協議會保證通常I幀不會丟失,UDP也會有更多策略保證I幀正確傳輸。
9、編解碼
軟編解碼
如H264,H265,MPEG-4等編解碼算法,更消耗CPU
硬編解碼
由於高清視頻的出現,編解碼逐漸讓CPU感到吃力。人們發現這種大數據量低難度的重復工作更適合讓GPU干,稱為硬編解碼。實際上沒有純粹的硬編解碼,只是其中大量運算的主力從CPU變為GPU。
10、流媒體傳輸協議
常見流媒體協議包括HTTP漸進下載和基於RTMP/RTP的實時流媒體協議,這兩種是完全不同的東西。直播中常見流媒體協議包括RTMP,HLS,HTTP FLV等。
RTMP
Real Time Messaging Protocol,實時消息傳送協議是Adobe為Flash播放器和服務器間音視頻傳輸開發的開放協議。基於TCP實現,一般延遲在1-3s左右。
HLS
HTTP Live Streaming是蘋果實現的基於HTTP的流媒體傳輸協議,可實現流媒體直播和點撥。HLS點播基本上就是常見的分段HTTP點播,不同的是它分段很小。基本原理就是把視頻流切片成TS,並建立M3U8索引。相對於RTMP、RTSP等,HLS的客戶端獲取的並不是一個完整數據流,而是不斷的下載並播放切片。這種特點決定了它的延遲一般高於普通的流媒體直播協議。
HTTP-FLV
基於HTTP長連接,和RTMP一樣,每個時刻的數據收到后都會立刻轉發,只是使用的是HTTP協議,一般延遲在1-3s
11、WebRTC
網頁即時通訊技術Web Real-Time Communication是谷歌的一個實時通訊解決方案,它通過瀏覽器實現音視頻的采集和播放,可以通過建立的通道進行音視頻的數據共享,被納入W3C推薦標准,被主流瀏覽器支持。詳細介紹會在之后發出。