原文參考鏈接 http://blog.csdn.net/leixiaohua1020/article/details/15811977#comments
尤其是使用FFMPEG進(jìn)行視音頻編解碼的人,有的已經(jīng)是有多年經(jīng)驗(yàn)的“大神”,有的是剛開始學(xué)習(xí)的初學(xué)者。在和大家探討的過程中,我忽然發(fā)現(xiàn)了一個(gè)問題:在“大神”和初學(xué)者之間好像有一個(gè)不可逾越的鴻溝?!按笊瘛眰兯礁叱?,探討著深?yuàn)W的問題;而初學(xué)者們還停留在入門階段。究竟是什么原因造成的這種“兩極分化”呢?最后,我發(fā)現(xiàn)了問題的關(guān)鍵:FFMPEG難度比較大,卻沒有一個(gè)循序漸進(jìn),由簡(jiǎn)單到復(fù)雜的教程?,F(xiàn)在網(wǎng)上的有關(guān)FFMPEG的教程多半難度比較大,不太適合剛接觸FFMPEG的人學(xué)習(xí);而且很多的例子程序編譯通不過,極大地打消了學(xué)習(xí)的積極性。我自己在剛開始學(xué)習(xí)FFMPEG的時(shí)候也遇到了很大的困難。為了幫助更多的人快速成為“大神”,我想總結(jié)一個(gè)學(xué)習(xí)FFMPEG的方法,方便大家循序漸進(jìn)的學(xué)習(xí)FFMPEG。
0. 背景知識(shí)
本章主要介紹一下FFMPEG都用在了哪里(在這里僅列幾個(gè)我所知的,其實(shí)遠(yuǎn)比這個(gè)多)。說白了就是為了說明:FFMPEG是非常重要的。
使用FFMPEG作為內(nèi)核視頻播放器:
Mplayer,ffplay,射手播放器,暴風(fēng)影音,KMPlayer,QQ影音...
使用FFMPEG作為內(nèi)核的Directshow Filter:
ffdshow,lav filters...
使用FFMPEG作為內(nèi)核的轉(zhuǎn)碼工具:
ffmpeg,格式工廠...
事實(shí)上,F(xiàn)FMPEG的視音頻編解碼功能確實(shí)太強(qiáng)大了,幾乎囊括了現(xiàn)存所有的視音頻編碼標(biāo)準(zhǔn),因此只要做視音頻開發(fā),幾乎離不開它。
對(duì)于完全沒有視音頻技術(shù)背景的人來說,在學(xué)習(xí)FFmpeg之前最好先了解一下幾種最基本的視音頻數(shù)據(jù)的格式,可以參考下面的文章:
http://blog.csdn.net/leixiaohua1020/article/details/18893769
1.? ? 視頻播放器原理
視音頻技術(shù)主要包含以下幾點(diǎn):封裝技術(shù),視頻壓縮編碼技術(shù)以及音頻壓縮編碼技術(shù)。如果考慮到網(wǎng)絡(luò)傳輸?shù)脑?,還包括流媒體協(xié)議技術(shù)。
視頻播放器播放一個(gè)互聯(lián)網(wǎng)上的視頻文件,需要經(jīng)過以下幾個(gè)步驟:解協(xié)議,解封裝,解碼視音頻,視音頻同步。如果播放本地文件則不需要解協(xié)議,為以下幾個(gè)步驟:解封裝,解碼視音頻,視音頻同步。他們的過程如圖所示。

解協(xié)議的作用,就是將流媒體協(xié)議的數(shù)據(jù),解析為標(biāo)準(zhǔn)的相應(yīng)的封裝格式數(shù)據(jù)。視音頻在網(wǎng)絡(luò)上傳播的時(shí)候,常常采用各種流媒體協(xié)議,例如HTTP,RTMP,或是MMS等等。這些協(xié)議在傳輸視音頻數(shù)據(jù)的同時(shí),也會(huì)傳輸一些信令數(shù)據(jù)。這些信令數(shù)據(jù)包括對(duì)播放的控制(播放,暫停,停止),或者對(duì)網(wǎng)絡(luò)狀態(tài)的描述等。解協(xié)議的過程中會(huì)去除掉信令數(shù)據(jù)而只保留視音頻數(shù)據(jù)。例如,采用RTMP協(xié)議傳輸?shù)臄?shù)據(jù),經(jīng)過解協(xié)議操作后,輸出FLV格式的數(shù)據(jù)。
解封裝的作用,就是將輸入的封裝格式的數(shù)據(jù),分離成為音頻流壓縮編碼數(shù)據(jù)和視頻流壓縮編碼數(shù)據(jù)。封裝格式種類很多,例如MP4,MKV,RMVB,TS,F(xiàn)LV,AVI等等,它的作用就是將已經(jīng)壓縮編碼的視頻數(shù)據(jù)和音頻數(shù)據(jù)按照一定的格式放到一起。例如,F(xiàn)LV格式的數(shù)據(jù),經(jīng)過解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
解碼的作用,就是將視頻/音頻壓縮編碼數(shù)據(jù),解碼成為非壓縮的視頻/音頻原始數(shù)據(jù)。音頻的壓縮編碼標(biāo)準(zhǔn)包含AAC,MP3,AC-3等等,視頻的壓縮編碼標(biāo)準(zhǔn)則包含H.264,MPEG2,VC-1等等。解碼是整個(gè)系統(tǒng)中最重要也是最復(fù)雜的一個(gè)環(huán)節(jié)。通過解碼,壓縮編碼的視頻數(shù)據(jù)輸出成為非壓縮的顏色數(shù)據(jù),例如YUV420P,RGB等等;壓縮編碼的音頻數(shù)據(jù)輸出成為非壓縮的音頻抽樣數(shù)據(jù),例如PCM數(shù)據(jù)
視音頻同步的作用,就是根據(jù)解封裝模塊處理過程中獲取到的參數(shù)信息,同步解碼出來的視頻和音頻數(shù)據(jù),并將視頻音頻數(shù)據(jù)送至系統(tǒng)的顯卡和聲卡播放出來。
2.? ? 流媒體協(xié)議
流媒體協(xié)議是服務(wù)器與客戶端之間通信遵循的規(guī)定。當(dāng)前網(wǎng)絡(luò)上主要的流媒體協(xié)議如表所示。

RTSP+RTP經(jīng)常用于IPTV領(lǐng)域。因?yàn)槠洳捎肬DP傳輸視音頻,支持組播,效率較高。但其缺點(diǎn)是網(wǎng)絡(luò)不好的情況下可能會(huì)丟包,影響視頻觀看質(zhì)量。因而圍繞IPTV的視頻質(zhì)量的研究還是挺多的。
RTSP規(guī)范可參考:
我的另外一篇文章 :RTSP協(xié)議
RTSP+RTP系統(tǒng)中衡量服務(wù)質(zhì)量可參考:
http://blog.csdn.net/leixiaohua1020/article/details/11883393
上海IPTV碼流分析結(jié)果可參考:IPTV視頻碼流分析
因?yàn)榛ヂ?lián)網(wǎng)網(wǎng)絡(luò)環(huán)境的不穩(wěn)定性,RTSP+RTP較少用于互聯(lián)網(wǎng)視音頻傳輸?;ヂ?lián)網(wǎng)視頻服務(wù)通常采用TCP作為其流媒體的傳輸層協(xié)議,因而像RTMP,MMS,HTTP這類的協(xié)議廣泛用于互聯(lián)網(wǎng)視音頻服務(wù)之中。這類協(xié)議不會(huì)發(fā)生丟包,因而保證了視頻的質(zhì)量,但是傳輸?shù)男蕰?huì)相對(duì)低一些。
此外RTMFP是一種比較新的流媒體協(xié)議,特點(diǎn)是支持P2P。
RTMP我做的研究相對(duì)多一些:
http://blog.csdn.net/leixiaohua1020/article/details/11694129
http://blog.csdn.net/leixiaohua1020/article/details/11704355
相關(guān)工具的源代碼分析:RTMPdump源代碼分析 1: main()函數(shù)[系列文章]
http://blog.csdn.net/leixiaohua1020/article/details/12952977
RTMP 協(xié)議學(xué)習(xí)
http://blog.csdn.net/leixiaohua1020/article/details/15814587
3.? ? 封裝格式
封裝格式的主要作用是把視頻碼流和音頻碼流按照一定的格式存儲(chǔ)在一個(gè)文件中?,F(xiàn)如今流行的封裝格式如下表所示:

由表可見,除了AVI之外,其他封裝格式都支持流媒體,即可以“邊下邊播”。有些格式更“萬能”一些,支持的視音頻編碼標(biāo)準(zhǔn)多一些,比如MKV。而有些格式則支持的相對(duì)比較少,比如說RMVB。
4.? ? 視頻編碼
視頻編碼的主要作用是將視頻像素?cái)?shù)據(jù)(RGB,YUV等)壓縮成為視頻碼流,從而降低視頻的數(shù)據(jù)量。如果視頻不經(jīng)過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。視頻編碼是視音頻技術(shù)中最重要的技術(shù)之一。視頻碼流的數(shù)據(jù)量占了視音頻總數(shù)據(jù)量的絕大部分。高效率的視頻編碼在同等的碼率下,可以獲得更高的視頻質(zhì)量。
視頻編碼的簡(jiǎn)單原理可以參考:
http://blog.csdn.net/leixiaohua1020/article/details/28114081

注:視頻編碼技術(shù)在整個(gè)視音頻技術(shù)中應(yīng)該是最復(fù)雜的技術(shù)。如果沒有基礎(chǔ)的話,可以先買一些書看一下原理,比如說《現(xiàn)代電視原理》《數(shù)字電視廣播原理與應(yīng)用》
4.1 主流編碼標(biāo)準(zhǔn)
H.264僅僅是一個(gè)編碼標(biāo)準(zhǔn),而不是一個(gè)具體的編碼器,H.264只是給編碼器的實(shí)現(xiàn)提供參照用的。
基于H.264標(biāo)準(zhǔn)的編碼器還是很多的,究竟孰優(yōu)孰劣?可參考
http://blog.csdn.net/leixiaohua1020/article/details/12373947
在學(xué)習(xí)視頻編碼的時(shí)候,可能會(huì)用到各種編碼器(實(shí)際上就是一個(gè)exe文件),他們常用的編碼命令可以參考:
http://blog.csdn.net/leixiaohua1020/article/details/11705495
學(xué)習(xí)H.264最標(biāo)準(zhǔn)的源代碼,就是其官方標(biāo)準(zhǔn)JM了。但是要注意,JM速度非常的慢,是無法用于實(shí)際的
http://blog.csdn.net/leixiaohua1020/article/details/11980219
實(shí)際中使用最多的就是x264了,性能強(qiáng)悍(超過了很多商業(yè)編碼器),而且開源。其基本教程網(wǎng)上極多,不再贅述。編碼時(shí)候可參考
http://blog.csdn.net/leixiaohua1020/article/details/12720135
編碼后統(tǒng)計(jì)值的含義 http://blog.csdn.net/leixiaohua1020/article/details/11884559
Google推出的VP8屬于和H.264同一時(shí)代的標(biāo)準(zhǔn)??傮w而言,VP8比H.264要稍微差一點(diǎn)。有一篇寫的很好的VP8的介紹文章?
http://blog.csdn.net/leixiaohua1020/article/details/12760173
5.? ? 音頻編碼
音頻編碼的主要作用是將音頻采樣數(shù)據(jù)(PCM等)壓縮成為音頻碼流,從而降低音頻的數(shù)據(jù)量。音頻編碼也是互聯(lián)網(wǎng)視音頻技術(shù)中一個(gè)重要的技術(shù)。但是一般情況下音頻的數(shù)據(jù)量要遠(yuǎn)小于視頻的數(shù)據(jù)量,因而即使使用稍微落后的音頻編碼標(biāo)準(zhǔn),而導(dǎo)致音頻數(shù)據(jù)量有所增加,也不會(huì)對(duì)視音頻的總數(shù)據(jù)量產(chǎn)生太大的影響。高效率的音頻編碼在同等的碼率下,可以獲得更高的音質(zhì)。
音頻編碼的簡(jiǎn)單原理可以參考 http://blog.csdn.net/leixiaohua1020/article/details/28114081

由表可見,近年來并未推出全新的音頻編碼方案,可見音頻編碼技術(shù)已經(jīng)基本可以滿足人們的需要。音頻編碼技術(shù)近期絕大部分的改動(dòng)都是在MP3的繼任者——AAC的基礎(chǔ)上完成的。
這些編碼標(biāo)準(zhǔn)之間的比較可以參考文章:音頻編碼方案之間音質(zhì)比較(AAC,MP3,WMA等)
http://blog.csdn.net/leixiaohua1020/article/details/11730661
結(jié)果大致是這樣的:
AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3
AAC格式的介紹:AAC格式簡(jiǎn)介
6.? ? 現(xiàn)有網(wǎng)絡(luò)視音頻平臺(tái)對(duì)比
現(xiàn)有的網(wǎng)絡(luò)視音頻服務(wù)主要包括兩種方式:點(diǎn)播和直播。點(diǎn)播意即根據(jù)用戶的需要播放相應(yīng)的視頻節(jié)目,這是互聯(lián)網(wǎng)視音頻服務(wù)最主要的方式。絕大部分視頻網(wǎng)站都提供了點(diǎn)播服務(wù)。直播意即互聯(lián)網(wǎng)視音頻平臺(tái)直接將視頻內(nèi)容實(shí)時(shí)發(fā)送給用戶,目前還處于發(fā)展階段。直播在網(wǎng)絡(luò)電視臺(tái),社交視頻網(wǎng)站較為常見。
6.1 直播平臺(tái)參數(shù)對(duì)比

可以看出,直播服務(wù)普遍采用了RTMP作為流媒體協(xié)議,F(xiàn)LV作為封裝格式,H.264作為視頻編碼格式,AAC作為音頻編碼格式。采用RTMP作為直播協(xié)議的好處在于其被Flash播放器支持。而Flash播放器如今已經(jīng)安裝在全球99%的電腦上,并且與瀏覽器結(jié)合的很好。因此這種流媒體直播平臺(tái)可以實(shí)現(xiàn)“無插件直播”,極大的簡(jiǎn)化了客戶端的操作。封裝格式,視頻編碼,音頻編碼方面,無一例外的使用了FLV + H.264 + AAC的組合。FLV是RTMP使用的封裝格式,H.264是當(dāng)今實(shí)際應(yīng)用中編碼效率最高的視頻編碼標(biāo)準(zhǔn),AAC則是當(dāng)今實(shí)際應(yīng)用中編碼效率最高的音頻編碼標(biāo)準(zhǔn)。視頻播放器方面,都使用了Flash播放器。
6.2 點(diǎn)播平臺(tái)參數(shù)對(duì)比

可以看出,點(diǎn)播服務(wù)普遍采用了HTTP作為流媒體協(xié)議,H.264作為視頻編碼格式,AAC作為音頻編碼格式。采用HTTP作為點(diǎn)播協(xié)議有以下兩點(diǎn)優(yōu)勢(shì):一方面,HTTP是基于TCP協(xié)議的應(yīng)用層協(xié)議,媒體傳輸過程中不會(huì)出現(xiàn)丟包等現(xiàn)象,從而保證了視頻的質(zhì)量;另一方面,HTTP被絕大部分的Web服務(wù)器支持,因而流媒體服務(wù)機(jī)構(gòu)不必投資購(gòu)買額外的流媒體服務(wù)器,從而節(jié)約了開支。點(diǎn)播服務(wù)采用的封裝格式有多種:MP4,F(xiàn)LV,F(xiàn)4V等,它們之間的區(qū)別不是很大。視頻編碼標(biāo)準(zhǔn)和音頻編碼標(biāo)準(zhǔn)是H.264和AAC。這兩種標(biāo)準(zhǔn)分別是當(dāng)今實(shí)際應(yīng)用中編碼效率最高的視頻標(biāo)準(zhǔn)和音頻標(biāo)準(zhǔn)。視頻播放器方面,無一例外的都使用了Flash播放器。
感謝 雷神 ,讓我入門?
原文鏈接 http://blog.csdn.net/leixiaohua1020/article/details/18893769