原文參考鏈接 http://blog.csdn.net/leixiaohua1020/article/details/15811977#comments
尤其是使用FFMPEG進行視音頻編解碼的人桥言,有的已經是有多年經驗的“大神”萌踱,有的是剛開始學習的初學者。在和大家探討的過程中号阿,我忽然發(fā)現(xiàn)了一個問題:在“大神”和初學者之間好像有一個不可逾越的鴻溝并鸵。“大神”們水平高超扔涧,探討著深奧的問題园担;而初學者們還停留在入門階段。究竟是什么原因造成的這種“兩極分化”呢枯夜?最后弯汰,我發(fā)現(xiàn)了問題的關鍵:FFMPEG難度比較大,卻沒有一個循序漸進卤档,由簡單到復雜的教程◎茫現(xiàn)在網上的有關FFMPEG的教程多半難度比較大,不太適合剛接觸FFMPEG的人學習劝枣;而且很多的例子程序編譯通不過汤踏,極大地打消了學習的積極性。我自己在剛開始學習FFMPEG的時候也遇到了很大的困難舔腾。為了幫助更多的人快速成為“大神”溪胶,我想總結一個學習FFMPEG的方法,方便大家循序漸進的學習FFMPEG稳诚。
0. 背景知識
本章主要介紹一下FFMPEG都用在了哪里(在這里僅列幾個我所知的哗脖,其實遠比這個多)。說白了就是為了說明:FFMPEG是非常重要的扳还。
使用FFMPEG作為內核視頻播放器:
Mplayer才避,ffplay,射手播放器氨距,暴風影音桑逝,KMPlayer,QQ影音...
使用FFMPEG作為內核的Directshow Filter:
ffdshow俏让,lav filters...
使用FFMPEG作為內核的轉碼工具:
ffmpeg楞遏,格式工廠...
事實上,F(xiàn)FMPEG的視音頻編解碼功能確實太強大了首昔,幾乎囊括了現(xiàn)存所有的視音頻編碼標準寡喝,因此只要做視音頻開發(fā),幾乎離不開它勒奇。
對于完全沒有視音頻技術背景的人來說预鬓,在學習FFmpeg之前最好先了解一下幾種最基本的視音頻數據的格式,可以參考下面的文章:
http://blog.csdn.net/leixiaohua1020/article/details/18893769
1.? ? 視頻播放器原理
視音頻技術主要包含以下幾點:封裝技術赊颠,視頻壓縮編碼技術以及音頻壓縮編碼技術格二。如果考慮到網絡傳輸的話,還包括流媒體協(xié)議技術巨税。
視頻播放器播放一個互聯(lián)網上的視頻文件蟋定,需要經過以下幾個步驟:解協(xié)議,解封裝草添,解碼視音頻驶兜,視音頻同步。如果播放本地文件則不需要解協(xié)議远寸,為以下幾個步驟:解封裝抄淑,解碼視音頻,視音頻同步驰后。他們的過程如圖所示肆资。
解協(xié)議的作用,就是將流媒體協(xié)議的數據灶芝,解析為標準的相應的封裝格式數據郑原。視音頻在網絡上傳播的時候唉韭,常常采用各種流媒體協(xié)議,例如HTTP犯犁,RTMP属愤,或是MMS等等。這些協(xié)議在傳輸視音頻數據的同時酸役,也會傳輸一些信令數據住诸。這些信令數據包括對播放的控制(播放,暫停涣澡,停止)贱呐,或者對網絡狀態(tài)的描述等。解協(xié)議的過程中會去除掉信令數據而只保留視音頻數據入桂。例如奄薇,采用RTMP協(xié)議傳輸的數據,經過解協(xié)議操作后事格,輸出FLV格式的數據惕艳。
解封裝的作用,就是將輸入的封裝格式的數據驹愚,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據远搪。封裝格式種類很多,例如MP4逢捺,MKV谁鳍,RMVB,TS劫瞳,F(xiàn)LV倘潜,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起志于。例如涮因,F(xiàn)LV格式的數據,經過解封裝操作后伺绽,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流养泡。
解碼的作用,就是將視頻/音頻壓縮編碼數據奈应,解碼成為非壓縮的視頻/音頻原始數據澜掩。音頻的壓縮編碼標準包含AAC,MP3杖挣,AC-3等等肩榕,視頻的壓縮編碼標準則包含H.264,MPEG2惩妇,VC-1等等株汉。解碼是整個系統(tǒng)中最重要也是最復雜的一個環(huán)節(jié)筐乳。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據郎逃,例如YUV420P哥童,RGB等等挺份;壓縮編碼的音頻數據輸出成為非壓縮的音頻抽樣數據褒翰,例如PCM數據
視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息匀泊,同步解碼出來的視頻和音頻數據优训,并將視頻音頻數據送至系統(tǒng)的顯卡和聲卡播放出來。
2.? ? 流媒體協(xié)議
流媒體協(xié)議是服務器與客戶端之間通信遵循的規(guī)定各聘。當前網絡上主要的流媒體協(xié)議如表所示揣非。
RTSP+RTP經常用于IPTV領域。因為其采用UDP傳輸視音頻躲因,支持組播早敬,效率較高。但其缺點是網絡不好的情況下可能會丟包大脉,影響視頻觀看質量搞监。因而圍繞IPTV的視頻質量的研究還是挺多的。
RTSP規(guī)范可參考:
我的另外一篇文章 :RTSP協(xié)議
RTSP+RTP系統(tǒng)中衡量服務質量可參考:
http://blog.csdn.net/leixiaohua1020/article/details/11883393
上海IPTV碼流分析結果可參考:IPTV視頻碼流分析
因為互聯(lián)網網絡環(huán)境的不穩(wěn)定性镰矿,RTSP+RTP較少用于互聯(lián)網視音頻傳輸琐驴£级粒互聯(lián)網視頻服務通常采用TCP作為其流媒體的傳輸層協(xié)議土榴,因而像RTMP椒功,MMS余赢,HTTP這類的協(xié)議廣泛用于互聯(lián)網視音頻服務之中障般。這類協(xié)議不會發(fā)生丟包汗茄,因而保證了視頻的質量炊苫,但是傳輸的效率會相對低一些谊却。
此外RTMFP是一種比較新的流媒體協(xié)議衙猪,特點是支持P2P馍乙。
RTMP我做的研究相對多一些:
http://blog.csdn.net/leixiaohua1020/article/details/11694129
http://blog.csdn.net/leixiaohua1020/article/details/11704355
相關工具的源代碼分析:RTMPdump源代碼分析 1: main()函數[系列文章]
http://blog.csdn.net/leixiaohua1020/article/details/12952977
RTMP 協(xié)議學習
http://blog.csdn.net/leixiaohua1020/article/details/15814587
3.? ? 封裝格式
封裝格式的主要作用是把視頻碼流和音頻碼流按照一定的格式存儲在一個文件中。現(xiàn)如今流行的封裝格式如下表所示:
由表可見屈嗤,除了AVI之外潘拨,其他封裝格式都支持流媒體,即可以“邊下邊播”饶号。有些格式更“萬能”一些铁追,支持的視音頻編碼標準多一些,比如MKV茫船。而有些格式則支持的相對比較少琅束,比如說RMVB扭屁。
4.? ? 視頻編碼
視頻編碼的主要作用是將視頻像素數據(RGB,YUV等)壓縮成為視頻碼流涩禀,從而降低視頻的數據量料滥。如果視頻不經過壓縮編碼的話,體積通常是非常大的艾船,一部電影可能就要上百G的空間葵腹。視頻編碼是視音頻技術中最重要的技術之一。視頻碼流的數據量占了視音頻總數據量的絕大部分屿岂。高效率的視頻編碼在同等的碼率下践宴,可以獲得更高的視頻質量。
視頻編碼的簡單原理可以參考:
http://blog.csdn.net/leixiaohua1020/article/details/28114081
注:視頻編碼技術在整個視音頻技術中應該是最復雜的技術爷怀。如果沒有基礎的話阻肩,可以先買一些書看一下原理,比如說《現(xiàn)代電視原理》《數字電視廣播原理與應用》
4.1 主流編碼標準
H.264僅僅是一個編碼標準运授,而不是一個具體的編碼器烤惊,H.264只是給編碼器的實現(xiàn)提供參照用的。
基于H.264標準的編碼器還是很多的吁朦,究竟孰優(yōu)孰劣柒室?可參考
http://blog.csdn.net/leixiaohua1020/article/details/12373947
在學習視頻編碼的時候,可能會用到各種編碼器(實際上就是一個exe文件)喇完,他們常用的編碼命令可以參考:
http://blog.csdn.net/leixiaohua1020/article/details/11705495
學習H.264最標準的源代碼伦泥,就是其官方標準JM了。但是要注意锦溪,JM速度非常的慢不脯,是無法用于實際的
http://blog.csdn.net/leixiaohua1020/article/details/11980219
實際中使用最多的就是x264了,性能強悍(超過了很多商業(yè)編碼器)刻诊,而且開源防楷。其基本教程網上極多,不再贅述则涯。編碼時候可參考
http://blog.csdn.net/leixiaohua1020/article/details/12720135
編碼后統(tǒng)計值的含義 http://blog.csdn.net/leixiaohua1020/article/details/11884559
Google推出的VP8屬于和H.264同一時代的標準复局。總體而言粟判,VP8比H.264要稍微差一點亿昏。有一篇寫的很好的VP8的介紹文章?
http://blog.csdn.net/leixiaohua1020/article/details/12760173
5.? ? 音頻編碼
音頻編碼的主要作用是將音頻采樣數據(PCM等)壓縮成為音頻碼流,從而降低音頻的數據量档礁。音頻編碼也是互聯(lián)網視音頻技術中一個重要的技術角钩。但是一般情況下音頻的數據量要遠小于視頻的數據量,因而即使使用稍微落后的音頻編碼標準,而導致音頻數據量有所增加递礼,也不會對視音頻的總數據量產生太大的影響惨险。高效率的音頻編碼在同等的碼率下,可以獲得更高的音質脊髓。
音頻編碼的簡單原理可以參考 http://blog.csdn.net/leixiaohua1020/article/details/28114081
由表可見辫愉,近年來并未推出全新的音頻編碼方案,可見音頻編碼技術已經基本可以滿足人們的需要将硝。音頻編碼技術近期絕大部分的改動都是在MP3的繼任者——AAC的基礎上完成的恭朗。
這些編碼標準之間的比較可以參考文章:音頻編碼方案之間音質比較(AAC,MP3袋哼,WMA等)
http://blog.csdn.net/leixiaohua1020/article/details/11730661
結果大致是這樣的:
AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3
AAC格式的介紹:AAC格式簡介
6.? ? 現(xiàn)有網絡視音頻平臺對比
現(xiàn)有的網絡視音頻服務主要包括兩種方式:點播和直播冀墨。點播意即根據用戶的需要播放相應的視頻節(jié)目,這是互聯(lián)網視音頻服務最主要的方式涛贯。絕大部分視頻網站都提供了點播服務。直播意即互聯(lián)網視音頻平臺直接將視頻內容實時發(fā)送給用戶蔚出,目前還處于發(fā)展階段弟翘。直播在網絡電視臺,社交視頻網站較為常見骄酗。
6.1 直播平臺參數對比
可以看出稀余,直播服務普遍采用了RTMP作為流媒體協(xié)議,F(xiàn)LV作為封裝格式趋翻,H.264作為視頻編碼格式睛琳,AAC作為音頻編碼格式。采用RTMP作為直播協(xié)議的好處在于其被Flash播放器支持踏烙。而Flash播放器如今已經安裝在全球99%的電腦上师骗,并且與瀏覽器結合的很好。因此這種流媒體直播平臺可以實現(xiàn)“無插件直播”讨惩,極大的簡化了客戶端的操作辟癌。封裝格式,視頻編碼荐捻,音頻編碼方面黍少,無一例外的使用了FLV + H.264 + AAC的組合。FLV是RTMP使用的封裝格式处面,H.264是當今實際應用中編碼效率最高的視頻編碼標準厂置,AAC則是當今實際應用中編碼效率最高的音頻編碼標準。視頻播放器方面魂角,都使用了Flash播放器昵济。
6.2 點播平臺參數對比
可以看出,點播服務普遍采用了HTTP作為流媒體協(xié)議,H.264作為視頻編碼格式砸紊,AAC作為音頻編碼格式传于。采用HTTP作為點播協(xié)議有以下兩點優(yōu)勢:一方面,HTTP是基于TCP協(xié)議的應用層協(xié)議醉顽,媒體傳輸過程中不會出現(xiàn)丟包等現(xiàn)象沼溜,從而保證了視頻的質量;另一方面游添,HTTP被絕大部分的Web服務器支持系草,因而流媒體服務機構不必投資購買額外的流媒體服務器,從而節(jié)約了開支唆涝。點播服務采用的封裝格式有多種:MP4找都,F(xiàn)LV,F(xiàn)4V等廊酣,它們之間的區(qū)別不是很大能耻。視頻編碼標準和音頻編碼標準是H.264和AAC。這兩種標準分別是當今實際應用中編碼效率最高的視頻標準和音頻標準亡驰。視頻播放器方面晓猛,無一例外的都使用了Flash播放器。
感謝 雷神 凡辱,讓我入門?
原文鏈接 http://blog.csdn.net/leixiaohua1020/article/details/18893769