該文章描述了如何在windows10 64位系統下面編譯出FFmpeg的庫及其自帶的ffplay播放器,而且全部采用最新的版本,這樣我們可以在vs2017的ide下調試ffplay,能使我們更容易學習FFmpeg的架構以及音視頻播放器的原理。
步驟:
1.安裝vs2017
在https://visualstudio.microsoft.com/zh-hans/downloads/下載vs2017的社區版,執行安裝程序后進入下面界面,選擇如圖所示的幾個項目安裝就行了。安裝后可得到msvc的交叉編譯環境,該toolchain用于在msys2下編譯FFmpeg。我這里的安裝路徑是"C:\Program Files (x86)\Microsoft Visual Studio"
2.安裝msys2
在http://www.msys2.org/下載msys2,如下圖所示,因為我是64位的系統,所以選擇 msys2-x86_64-20180531.exe進行安裝下載。
3.下載ffmpeg源碼和SDL2源碼
在http://ffmpeg.org/download.html下載最新的FFmpeg代碼,我是使用git直接clone下最新的FFmpeg的源碼到本地的,當然也可以選擇直接下載打包好的源碼。我的FFmpeg的源碼目錄是D:\git\FFmpeg。
在http://www.libsdl.org/download-2.0.php下載SDL2的源碼,我選擇的源碼的zip包下載的,也就是SDL2-2.0.9.zip。我將其解壓到D盤,目錄是D:\SDL2-2.0.9
4.編譯SDL2生成SDL2的靜態庫和動態庫
啟動vs2017,導入D:\SDL2-2.0.9\VisualC下的解決方案,原解決方案是vs2010下的,導入過程中會升級到最新的平臺工具集。然后我們點擊SDL2和SDL2main兩個項目進行生成,編譯成功后會生成32位的SDL2的靜態庫和動態庫,位置在D:\SDL2-2.0.9\VisualC\Win32下面,其中的SDL2.dll,SDL2.lib,SDL2main.lib三個文件是我們編譯ffplay需要的。
上面還只是編譯出32位的SDL2的庫,如果要64位的庫,我們只需將編譯環境改成x64后對SDL2和SDL2main兩個項目進行生成,成功后的庫在D:\SDL2-2.0.9\VisualC\x64\Debug目錄下。
上面生成的庫是debug的庫,如果需要release的庫改一下編譯選項即可。
5.設置msys2的編譯環境
進入msys2的安裝路徑,我這里的路徑是D:\mysys64,編輯該目錄下的msys2_shell.cmd文件,在setlocal后加入一行
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
該命令表示加載vs2017的32位交叉編譯環境,如果要編譯64位的庫則執行vcvars64.bat,也就是
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
6.編譯FFmpeg的靜態庫和動態庫
在步驟5設置好msys2的環境后執行msys2_shell.cmd,進入msys2的命令行模式,windows系統默認是gbk編碼,編譯過程中可能出現亂碼,需要修改該窗口的text為gbk編碼,右鍵點擊窗口選擇Options,再選擇Text,修改編碼為gbk,如下圖所示
進入FFmpeg的源碼目錄進行編譯,我這里是D:\git\FFmpeg,FFmpeg的配置如下,其中--prefix=x32中的x32表示編譯好后的安裝目錄,編譯成功后執行make install會放在FFmpeg目錄下的x32文件夾里面。
cd /d/git/FFmpeg
./configure --enable-shared --enable-static --toolchain=msvc --prefix=x32 --enable-postproc --enable-gpl --enable-avresample
執行./configure命令后等待比較長時間直到回到命令行提示符
由于windows10系統默認是gbk編碼,而我們FFmpeg的源碼都是utf8編碼,編譯時候如果代碼里面有中文,就會產生問題,有2個文件里面帶有中文,我們需要將其轉換為utf8編碼,一個是D:\git\FFmpeg\config.h,另外一個是D:\git\FFmpeg\ffbuild\config.mak。
轉換完成以后執行編譯命令
make -j4
經過很長時間編譯完成后執行
make install
現在我們打開FFmpeg目錄下的x32目錄,就可以看到編譯好的FFmpeg的靜態庫和動態庫
bin目錄下放的是靜態庫和動態庫,include目錄下放的是頭文件,這兩個目錄下的東西都是我們在vs2017環境下編譯ffplay需要的。
7.在vs2017下編譯ffplay
打開vs2017選擇文件,新建項目,選擇visual c++下的Windows桌面,建立一個空項目
開始拷貝文件到ffplay目錄下,我這里SDL的目錄是D:\SDL2-2.0.9\VisualC\Win32,FFmpeg的目錄是D:\git\FFmpeg。在D:\ffplay\ffplay目錄下新建一個文件夾lib用于放ffmpeg靜態庫和sdl2的靜態庫。
拷貝D:\git\FFmpeg\下的config.h文件到D:\ffplay\ffplay目錄
拷貝D:\git\FFmpeg\fftools下的ffplay.c,cmdutils.c,cmdutils.h三個文件到D:\ffplay\ffplay目錄
拷貝D:\git\FFmpeg\x32下的include文件夾到D:\ffplay\ffplay目錄下,如果是64位的,則從D:\git\FFmpeg\x64下拷貝。
拷貝D:\git\FFmpeg\x32\bin下的所有擴展名為lib的文件到D:\ffplay\ffplay\lib下面,拷貝D:\git\FFmpeg\x32\bin下的所有擴展名為dll的文件到D:\ffplay\ffplay下面。如果是64位的,則從D:\git\FFmpeg\x64\bin文件夾拷貝。
拷貝D:\SDL2-2.0.9\VisualC\Win32\Debug下的SDL2.lib,SDL2main.lib到D:\ffplay\ffplay\lib下面,拷貝D:\SDL2-2.0.9\VisualC\Win32\Debug下的SDL2.dll到D:\ffplay\ffplay下面。如果是64位的,則從D:\SDL2-2.0.9\VisualC\x64\Debug文件夾下拷貝。
在D:\ffplay\ffplay\include目錄下新建一個文件夾SDL2,拷貝D:\SDL2-2.0.9\include下的全部頭文件到D:\ffplay\ffplay\include\SDL2目錄下。
現在文件拷貝完畢,開始配置ffplay項目的屬性。
右鍵點擊ffplay下的源文件,選擇添加-》現有項,把D:\ffplay\ffplay目錄下的cmdutils.c和ffplay.c加進來。如下圖所示
右鍵點擊ffplay下的頭文件,選擇添加-》現有項,把D:\ffplay\ffplay目錄下的cmdutils.h和config.h加進來。
右鍵點擊ffplay,選擇屬性,配置屬性下的常規,項目默認的字符集改成使用Unicode字符集,如下圖所示
VC++目錄下庫目錄加上lib,如下圖所示
C/C++下的常規中,附加包含目錄改成include,另外SDL檢查改成否,如下圖所示
鏈接器下的輸入中的附加依賴項改成
avcodec.lib;avformat.lib;avutil.lib;avdevice.lib;avfilter.lib;postproc.lib;swresample.lib;swscale.lib;SDL2.lib;SDL2main.lib;avresample.lib;%(AdditionalDependencies)如下圖所示
右鍵點擊ffplay項目,選擇重新掃描方案,然后開始編譯
編譯遇到錯誤,找不到三個頭文件,注釋掉就可以了,如下圖所示,注釋掉ffplay.c中這三個出錯的頭文件引用就可以了
現在ffplay已經可以編譯通過了,可以測試一下能否正常工作,選擇ffplay屬性頁中的調試,將命令參數設置需要播放的音視頻文件地址,就可以了,記得命令參數要空格開頭,不同參數之前用空格隔開
點擊本地windows調試器開始運行ffplay
總結:
在windows環境下編譯FFmpeg和ffplay并不復雜,編譯好的庫可以正常在vs2017下調用,我們可以方便的使用這些庫開發windows下的音視頻播放器。
編譯重點在于選擇和正確配置編譯環境,32位和64位的庫要選擇相對應的編譯環境,另外由于windows環境是gbk編碼,而FFmpeg是utf8編碼,所以編譯過程中可能遇到這方面問題,具體情況需要具體分析。
特別紀念雷霄驊博士,我就是在他的文章的指導下了解了很多關于FFmpeg的知識,希望他在天堂安好。