在CSDN上的這一段日子,接觸到了很多同行業的人,尤其是使用FFMPEG進行視音頻編解碼的人,有的已經是有多年經驗的“大神”,有的是剛開始學習的初學者。在和大家探讨的過程中,我忽然發現了一個問題:在“大神”和初學者之間好像有一個不可逾越的鴻溝。“大神”們水準高超,探讨着深奧的問題;而初學者們還停留在入門階段。究竟是什麼原因造成的這種“兩極分化”呢?最後,我發現了問題的關鍵:FFMPEG難度比較大,卻沒有一個循序漸進,由簡單到複雜的教程。現在網上的有關FFMPEG的教程多半難度比較大,不太适合剛接觸FFMPEG的人學習;而且很多的例子程式編譯通不過,極大地打消了學習的積極性。我自己在剛開始學習FFMPEG的時候也遇到了很大的困難。為了幫助更多的人快速成為“大神”,我想總結一個學習FFMPEG的方法,友善大家循序漸進的學習FFMPEG。

本章主要介紹一下FFMPEG都用在了哪裡(在這裡僅列幾個我所知的,其實遠比這個多)。說白了就是為了說明:FFMPEG是非常重要的。
使用FFMPEG作為核心視訊播放器:
Mplayer,ffplay,射手播放器,暴風影音,KMPlayer,QQ影音...
使用FFMPEG作為核心的Directshow Filter:
ffdshow,lav filters...
使用FFMPEG作為核心的轉碼工具:
ffmpeg,格式工廠...
事實上,FFMPEG的視音頻編解碼功能确實太強大了,幾乎囊括了現存所有的視音頻編碼标準,是以隻要做視音頻開發,幾乎離不開它。
本章主要介紹一下ffmpeg工程包含的三個exe的使用方法。
該網站中的FFMPEG分為3個版本:Static,Shared,Dev。
前兩個版本可以直接在指令行中使用,他們的差別在于:Static裡面隻有3個應用程式:ffmpeg.exe,ffplay.exe,ffprobe.exe,每個exe的體積都很大,相關的Dll已經被編譯到exe裡面去了。Shared裡面除了3個應用程式:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,還有一些Dll,比如說avcodec-54.dll之類的。Shared裡面的exe體積很小,他們在運作的時候,到相應的Dll中調用功能。
Dev版本是用于開發的,裡面包含了庫檔案xxx.lib以及頭檔案xxx.h,這個版本不包含exe檔案。
打開系統指令行接面,切換到ffmpeg所在的目錄,就可以使用這3個應用程式了。
ffmpeg是用于轉碼的應用程式。
一個簡單的轉碼指令可以這樣寫:
将input.avi轉碼成output.ts,并設定視訊的碼率為640kbps
ffmpeg -i input.avi -b:v 640k output.ts
ffplay是用于播放的應用程式。
一個簡單的播放指令可以這樣寫:
播放test.avi
ffplay test.avi
ffprobe是用于檢視檔案格式的應用程式。
這個就不多介紹了。
本章開始介紹使用ffmpeg的庫進行開發。
1.下載下傳Dev版本,裡面包含了ffmpeg的xxx.h頭檔案以及xxx.lib庫檔案。
2.下載下傳Shared版本,裡面包含了ffmpeg的dll檔案。
3.将這兩部分檔案拷貝到VC工程下面就可以了
結構體中每個變量的分析,參考文章:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214577" target="_blank">FFMPEG結構體分析:AVFrame</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214705" target="_blank">FFMPEG結構體分析:AVFormatContext</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214859" target="_blank">FFMPEG結構體分析:AVCodecContext</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215369" target="_blank">FFMPEG結構體分析:AVIOContext</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215833" target="_blank">FFMPEG結構體分析:AVCodec</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215821" target="_blank">FFMPEG結構體分析:AVStream</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215755" target="_blank">FFMPEG結構體分析:AVPacket</a>
注:如果想要檢視解碼後的資料(PCM資料),需要用到Audition。
上面那篇文章是用的類庫比較舊,新版類庫的的使用可以參考下面幾篇文章。
轉碼實際上是先解碼然後編碼。
通曉了ffmpeg庫的使用以後,可以看一下ffmpeg的源代碼。注意ffmpeg的源代碼隻有在linux下才能編譯,在windows下可以使用MinGW進行編譯。推薦使用Eclipse檢視ffmpeg的源代碼。
ffmpeg源代碼分析文章清單如下。
庫函數分析:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/8661601" target="_blank">圖解FFMPEG打開媒體的函數avformat_open_input</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12677129" target="_blank">ffmpeg 源代碼簡單分析 : av_register_all()</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12677265" target="_blank">ffmpeg 源代碼簡單分析 : avcodec_register_all()</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12678577" target="_blank">ffmpeg 源代碼簡單分析 : av_read_frame()</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12679719" target="_blank">ffmpeg 源代碼簡單分析 : avcodec_decode_video2()</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/11885813" target="_blank">FFMPEG源碼分析:avformat_open_input()(媒體打開函數)</a>
ffmpeg.exe源代碼分析:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/11851579" target="_blank">ffmpeg源碼分析:transcode_init()函數</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/11851533" target="_blank">ffmpeg源碼分析:transcode()函數</a>
學習完成ffmpeg,還可以了解一下基于ffmpeg的相關的多媒體開源工程,在這裡推薦以下幾個:
ffdshow是基于ffmpeg的解碼器類庫libavcodec的DirectShow Filter。廣泛安裝在PC上。
有關ffdshow的源代碼分析文章(更新中):
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12013619" target="_blank">ffdshow 源代碼分析1 : 整體結構</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12981725" target="_blank">ffdshow 源代碼分析 2: 位圖覆寫濾鏡(對話框部分Dialog)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13004051" target="_blank">ffdshow 源代碼分析 3: 位圖覆寫濾鏡(設定部分Settings)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13006213" target="_blank">ffdshow 源代碼分析 4: 位圖覆寫濾鏡(濾鏡部分Filter)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13660583" target="_blank">ffdshow 源代碼分析 5: 位圖覆寫濾鏡(總結)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493329" target="_blank">ffdshow 源代碼分析 6: 對解碼器的dll的封裝(libavcodec)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493521" target="_blank">ffdshow 源代碼分析 7: libavcodec視訊解碼器類(TvideoCodecLibavcodec)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493743" target="_blank">ffdshow 源代碼分析 8: 視訊解碼器類(TvideoCodecDec)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493961" target="_blank">ffdshow 源代碼分析 9: 編解碼器有關類的總結</a>
LAV Filter是基于ffmpeg的解碼器類庫libavcodec,以及解封裝器類庫libavformat的DirectShow Filter。廣泛安裝在PC上。
有關LAV Filter的源代碼分析文章:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12711379" target="_blank">LAV Filter 源代碼分析 1: 總體結構</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/12711723" target="_blank">LAV Filter 源代碼分析 2: LAV Splitter</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13022201" target="_blank">LAV Filter 源代碼分析 3: LAV Video (1)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13272409" target="_blank">LAV Filter 源代碼分析 4: LAV Video (2)</a>
Mplayer是Linux下使用最廣泛的播放器,也有Windows版本的。其中使用了ffmpeg。
有關Mplayer的源代碼分析文章:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/11885509" target="_blank">MPlayer源代碼分析</a>
現在廣為使用很多點傳播放器都是建構于Media Player Classic - HC的基礎之上的。
有關Media Player Classic - HC的源代碼分析文章:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13280659" target="_blank">Media Player Classic - HC 源代碼分析 1:整體結構</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13290345" target="_blank">Media Player Classic - HC 源代碼分析 2:核心類 (CMainFrame)(1)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297291" target="_blank">Media Player Classic - HC 源代碼分析 3:核心類 (CMainFrame)(2)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13298397" target="_blank">Media Player Classic - HC 源代碼分析 4:核心類 (CMainFrame)(3)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297555" target="_blank">Media Player Classic - HC 源代碼分析 5:關于對話框 (CAboutDlg)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297589" target="_blank">Media Player Classic - HC 源代碼分析 6:MediaInfo頁籤 (CPPageFileMediaInfo)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297621" target="_blank">Media Player Classic - HC 源代碼分析 7:詳細資訊頁籤(CPPageFileInfoDetails)</a>
from:http://blog.csdn.net/leixiaohua1020/article/details/15811977
XBMC是一個優秀的自由和開源的(GPL)媒體中心軟體。
有關XBMC源代碼分析文章:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17454977" target="_blank">XBMC源代碼分析 1:整體結構以及編譯方法</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17511993" target="_blank">XBMC源代碼分析 2:Addons(皮膚Skin)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512743" target="_blank">XBMC源代碼分析 3:核心部分(core)-綜述</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512509" target="_blank">XBMC源代碼分析 4:視訊播放器(dvdplayer)-解碼器(以ffmpeg為例)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512633" target="_blank">XBMC源代碼簡析 5:視訊播放器(dvdplayer)-解複用器(以ffmpeg為例)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512653" target="_blank">XBMC源代碼分析 6:視訊播放器(dvdplayer)-檔案頭(以ffmpeg為例)</a>
<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512667" target="_blank">XBMC源代碼分析 7:視訊播放器(dvdplayer)-輸入流(以libRTMP為例)</a>
在這裡介紹一下FFmpeg中AVFilter的使用。AVFilter可以給試飲品添加各種處理效果。有一個簡單的例子,是給視訊添加水印:
<a href="http://blog.csdn.net/leixiaohua1020/article/details/29368911" target="_blank">最簡單的基于FFmpeg的AVfilter例子(水印疊加)</a>