近期在學習音視頻,看了不少雷神(雷霄驊(leixiaohua1020)的專欄) 的文章,也作了相應的筆記,後面會陸陸續續發佈。 雖然雷神不在了,但他留下了許多寶貴的財富,做爲一名程序猿應向他學習,致敬!🙏🙏🙏瀏覽器
歡迎加入技術交流羣 羣號: 552340860服務器
視音頻技術主要包含如下幾點:封裝技術,視頻壓縮編碼技術以及音頻壓縮編碼技術。若是考慮到網絡傳輸的話,還包括流媒體協議技術。 視頻播放器播放一個互聯網上的視頻文件,須要通過如下幾個步驟:解協議,解封裝,解碼視音頻,視音頻同步。若是播放本地文件則不須要解協議,爲如下幾個步驟:解封裝,解碼視音頻,視音頻同步。他們的過程如圖所示。 網絡
分析一下以上的每一個流程:函數
將流媒體協議
的數據,解析爲標準的相應的封裝格式數據
。視音頻在網絡上傳播的時候,經常採用各類流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據
。這些信令數據
包括對播放的控制(播放,暫停,中止),或者對網絡狀態的描述等。解協議的過程當中會去除掉信令數據而只保留視音頻數據。例如,採用RTMP協議傳輸的數據,通過解協議操做後,輸出FLV格式的數據。工具
將輸入的封裝格式的數據
,分離成爲音頻流壓縮編碼數據
和視頻流壓縮編碼數據
。封裝格式種類不少,例如MP4,MKV,RMVB,TS,FLV,AVI
等等,它的做用就是將已經壓縮編碼的視頻數據和音頻數據按照必定的格式放到一塊兒。例如,FLV格式的數據,通過解封裝操做後,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。性能
將視頻/音頻壓縮編碼數據,解碼成爲非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3,AC-3
等等,視頻的壓縮編碼標準則包含H.264,MPEG2,VC-1
等等。解碼是整個系統中最重要也是最複雜的一個環節。經過解碼,壓縮編碼的視頻數據輸出成爲非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻數據輸出成爲非壓縮的音頻抽樣數據,例如PCM數據(脈衝編碼調製(Pulse Code Modulation,PCM)
)。學習
根據解封裝模塊
處理過程當中獲取到的參數信息,同步
解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。網站
流媒體協議是服務器與客戶端之間通訊遵循的規定。當前網絡上主要的流媒體協議如圖表所示。編碼
RTSP+RTP
常常用於IPTV
領域。由於其採用UDP
傳輸視音頻,支持組播,效率較高。但其缺點是網絡很差的狀況下可能會丟包,影響視頻觀看質量。於是圍繞IPTV
的視頻質量的研究仍是挺多的。.net
RTSP+RTP
系統中衡量服務質量可參考:網絡視頻傳輸的服務質量(QoS)
由於互聯網網絡環境的不穩定性,RTSP+RTP
較少用於互聯網視音頻傳輸。互聯網視頻服務一般採用TCP
做爲其流媒體的傳輸層協議,於是像RTMP,MMS,HTTP
這類的協議普遍用於互聯網視音頻服務之中。這類協議不會發生丟包,於是保證了視頻的質量,可是傳輸的效率會相對低一些。
RTSP
規範可參考:RTSP協議學習筆記
RTMFP是一種比較新的流媒體協議,特色是支持P2P。 好比RTMP規範簡單分析,或者RTMP流媒體播放過程
相關工具的源代碼分析:RTMPdump源代碼分析 1: main()函數[系列文章]
RTMP協議學習:RTMP流媒體技術零基礎學習方法
封裝格式的主要做用是把視頻碼流和音頻碼流按照必定的格式存儲在一個文件中。現現在流行的封裝格式以下圖表所示:
AVI
以外,其餘封裝格式都支持流媒體,便可以「
邊下邊播
」。有些格式更「萬能」一些,支持的視音頻編碼標準多一些,好比
MKV
。而有些格式則支持的相對比較少,好比說
RMVB
。
視頻編碼的主要做用是將視頻像素數據(RGB,YUV等)壓縮成爲視頻碼流,從而下降視頻的數據量。若是視頻不通過壓縮編碼的話,體積一般是很是大的,一部電影可能就要上百G的空間。視頻編碼是視音頻技術中最重要的技術之一。視頻碼流的數據量佔了視音頻總數據量的絕大部分。高效率的視頻編碼在同等的碼率下,能夠得到更高的視頻質量。 視頻編碼的簡單原理能夠參考:視頻壓縮編碼和音頻壓縮編碼的基本原理
H.264
。
H.264
僅僅是一個編碼標準,而不是一個具體的編碼器,H.264只是給編碼器的實現提供參照用的。
基於H.264標準的編碼器仍是不少,可參考:MSU出品的 H.264編碼器比較(2011.5)
在學習視頻編碼的時候,可能會用到各類編碼器(實際上就是一個exe文件),他們經常使用的編碼命令能夠參考:各類視頻編碼器的命令行格式
學習H.264
最標準的源代碼,就是其官方標準JM了。可是要注意,JM速度很是的慢,是沒法用於實際的:H.264參考軟件JM12.2RC代碼詳細流程
實際中使用最多的就是x264了,性能強悍(超過了不少商業編碼器),並且開源。。編碼時候可參考:x264編碼指南——碼率控制。編碼後統計值的含義:X264輸出的統計值的含義(X264 Stats Output)
Google推出的VP8屬於和H.264同一時代的標準。整體而言,VP8比H.264要稍微差一點。有一篇寫的很好的VP8的介紹文章:深刻了解 VP8。除了在技術領域,VP8和H.264在專利等方面也是打的不可開交,可參考文章:WebM(VP8) vs H.264
此外,我國還推出了本身的國產標準AVS,性能也不錯,但目前比H.264仍是要稍微遜色一點。不過感受我國在視頻編解碼領域還算比較先進的,可參考:視頻編碼國家標準AVS與H.264的比較(節選)
下一代的編解碼標準就要數HEVC和VP9了。VP9是Google繼VP8以後推出的新一代標準。VP9和HEVC相比,要稍微遜色一些。它們的對比可參考:(1)HEVC與VP9編碼效率對比 (2)HEVC,VP9,x264性能對比
HEVC在將來擁有不少大的優點,可參考:HEVC將會取代H.264的緣由
學習HEVC最標準的源代碼,就是其官方標準HM了。其速度比H.264的官方標準代碼又慢了一大截,使用可參考:HEVC學習—— HM的使用
將來實際使用的HEVC開源編碼器頗有多是x265,目前該項目還處於發展階段,可參考:x265(HEVC編碼器,基於x264)介紹。x265的使用能夠參考:HEVC(H.265)標準的編碼器(x265,DivX265)試用
主流以及下一代編碼標準之間的比較能夠參考文章:視頻編碼方案之間的比較(HEVC,H.264,MPEG2等)
此外,在碼率必定的狀況下,幾種編碼標準的比較可參考:限制碼率的視頻編碼標準比較(包括MPEG-2,H.263, MPEG-4,以及 H.264)
結果大體是這樣的: HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2
。
音頻編碼
的主要做用是將音頻採樣數據(PCM等)壓縮成爲音頻碼流,從而下降音頻的數據量。音頻編碼也是互聯網視音頻技術中一個重要的技術。可是通常狀況下音頻的數據量要遠小於視頻的數據量,於是即便使用稍微落後的音頻編碼標準,而致使音頻數據量有所增長,也不會對視音頻的總數據量產生太大的影響。高效率的音頻編碼在同等的碼率下,能夠得到更高的音質。 音頻編碼的簡單原理能夠參考:視頻壓縮編碼和音頻壓縮編碼的基本原理
這些編碼標準之間的比較能夠參考文章:音頻編碼方案之間音質比較(AAC,MP3,WMA等)
結果大體是這樣的: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3
AAC格式的介紹:AAC格式簡介 AAC幾種不一樣版本之間的對比:AAC規格(LC,HE,HEv2)及性能對比 AAC專利方面的介紹:AAC專利介紹 此外杜比數字的編碼標準也比較流行,可是貌似比最新的AAC稍爲遜色:AC-3技術綜述
現有的網絡視音頻服務主要包括兩種方式:點播和直播。點播意即根據用戶的須要播放相應的視頻節目,這是互聯網視音頻服務最主要的方式。絕大部分視頻網站都提供了點播服務。直播意即互聯網視音頻平臺直接將視頻內容實時發送給用戶,目前還處於發展階段。直播在網絡電視臺,社交視頻網站較爲常見。
能夠看出,直播服務廣泛採用了RTMP
做爲流媒體協議
,FLV
做爲封裝格式
,H.264
做爲視頻編碼格式,AAC
做爲音頻編碼格式
。採用RTMP
做爲直播協議
的好處在於其被Flash播放器支持。而Flash播放器現在已經安裝在全球99%的電腦上,而且與瀏覽器結合的很好。所以這種流媒體直播平臺能夠實現「無插件直播」,極大的簡化了客戶端的操做。封裝格式,視頻編碼,音頻編碼方面,無一例外的使用了FLV + H.264 + AAC
的組合。FLV
是RTMP
使用的封裝格式,H.264
是當今實際應用中編碼效率最高的視頻編碼標準,AAC
則是當今實際應用中編碼效率最高的音頻編碼標準。視頻播放器方面,都使用了Flash播放器。
能夠看出,點播服務廣泛採用了HTTP做爲流媒體協議,H.264做爲視頻編碼格式,AAC做爲音頻編碼格式。採用HTTP做爲點播協議有如下兩點優點:一方面,HTTP是基於TCP協議的應用層協議,媒體傳輸過程當中不會出現丟包等現象,從而保證了視頻的質量;另外一方面,HTTP被絕大部分的Web服務器支持,於是流媒體服務機構沒必要投資購買額外的流媒體服務器,從而節約了開支。點播服務採用的封裝格式有多種:MP4,FLV,F4V等,它們之間的區別不是很大。視頻編碼標準和音頻編碼標準是H.264和AAC。這兩種標準分別是當今實際應用中編碼效率最高的視頻標準和音頻標準。視頻播放器方面,無一例外的都使用了Flash播放器。