ffmpeg開發環境構建
一、相關資源介紹
本文主要講述linux平臺x86(及x86-64)架構下的ffmpeg編譯安裝過程。
其他嵌入式平臺需要交叉編譯,過程類似,不詳述。
本實驗在opensuse和ubuntu兩個平臺作了驗證。使用lsb_release -a
命令檢視系統發行版版本:
opensuse平臺版本:openSUSE Leap 42.3。
ubuntu平臺版本:Ubuntu 16.04.5 LTS。
1. yasm/nasm
舊版ffmpeg及x264使用yasm彙編器
Yasm是英特爾x86架構下的一個彙編器和反彙編器。Yasm是一個完全重寫的Netwide彙編器(NASM)。Yasm通常可以與NASM互換使用,並支援x86和x86-64架構。其許可協議為修訂過的BSD許可證。
此處Yasm用來編譯x86平臺下ffmpeg中部分彙編程式碼。
注意,Yasm是x86平臺彙編器,不需要交叉編譯。若是arm等其他平臺,交叉編譯工具鏈中包含有對應的彙編器,則交叉編譯時需要--disable-yasm選項。
Yasm官網:
新版ffmpeg及x264改用nasm彙編器
Netwide Assembler(簡稱NASM)是一款基於英特爾x86架構的彙編與反彙編工具。NASM被認為是Linux平臺上最受歡迎的彙編工具之一。
NASM官網:https://www.nasm.us/
2. x264
x264是開源的h264編碼器,使用非常廣泛,綜合性能不比商業編解碼器差。
x264官網:https://www.videolan.org/developers/x264.html
3. x265
x265是開源的h265編碼器。
x265官網:http://www.x265.org/
下載地址一:
下載地下二:https://www.videolan.org/developers/x265.html
ffmpeg工程中實現了h265解碼器,但無h265編碼器。因此需要安裝第三方編碼器x265
4. SDL
SDL(Simple DirectMedia Layer)是一套開源的跨平臺多媒體開發庫。SDL提供了數種控制影象、聲音、輸出輸入的函式,封裝了複雜的視音訊底層操作,簡化了視音訊處理的難度。目前SDL多用於開發遊戲、模擬器、媒體播放器等多媒體應用領域。
SDL官網:https://www.libsdl.org/
5. ffmpeg
ffmpeg官網:https://www.ffmpeg.org/
二、編譯過程
1. 規劃安裝路徑
將編譯原始碼得到的程式資源安裝到使用者目錄/home/think下。則安裝後,/home/think目錄下會多出bin、include、lib、share等目錄
配置環境變數
編輯/etc/profile,新增如下幾行:
export PATH=/home/think/bin:$PATH
export LIBRARY_PATH=/home/think/lib:/home/think/lib64:$LIBRARY_PATH
export PKG_CONFIG_PATH=/home/think/lib/pkgconfig:$PKG_CONFIG_PATH
export C_INCLUDE_PATH=/home/think/include:$C_INCLUDE_PATH
上述幾個環境變數是程式編譯時需要用到的庫檔案、標頭檔案路徑,以及可執行程式所在路徑。
在命令列中執行如下命令,使新設定的環境變數立即生效:
source /etc/profile
配置動態庫路徑
編輯/etc/ld.so.conf,新增如下兩行:
/home/think/lib
/home/think/lib64
ld.so.conf中的內容是程式執行時需要搜尋的動態庫路徑。
在命令列中執行如下命令,使新設定的動態庫路徑立即生效:
ldconfig
2. yasm/nasm
舊版ffmpeg及x264使用yasm彙編器
在官網下載頁面http://yasm.tortall.net/Download.html下載最新版原始碼yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure --prefix=/home/think
make
make install
新版ffmpeg及x264改用nasm彙編器
具體從哪一版本開始改用nasm不太清楚,至今日2018-11-20得到的最新版本已改用nasm
在官網https://www.nasm.us/下載最新版原始碼nasm-2.14.tar.bz2
tar -zxvf nasm-2.14.tar.gz
cd nasm-2.14/
./configure --prefix=/home/think
make
make install
3. x264
在網址https://www.videolan.org/developers/x264.html下載原始碼包last_x264.tar.bz2,這是git倉庫的master分支原始碼。我們直接輸入以下地址下載stable分支:
http://download.videolan.org/x264/snapshots/last_stable_x264.tar.bz2
下載得到last_stable_x264.tar.bz2原始碼包。
tar -jxvf last_stable_x264.tar.bz2
cd x264-snapshot-20181119-2245-stable/
./configure --prefix=/home/think --enable-shared --enable-static
make
make install
注意第4行配置選項中,未給出--disable-asm選項,則表示啟用匯編選項
4. x265
在網址https://bitbucket.org/multicoreware/x265/downloads/下載原始碼包x265_2.9.tar.gz
編譯說明參照https://bitbucket.org/multicoreware/x265/wiki/Home
tar -zxvf x265_2.9.tar.gz
cd x265_2.9/build/linux/
./make-Makefiles.bash
在上一行命令執行快結束時,出現cmake配置資訊編輯介面,將CMAKE_INSTALL_PREFIX的值改成/home/think
make
make install
5. SDL
注意:應先安裝SDL,再安裝ffmpeg,否則ffmpeg編譯時不會生成ffplay
原因如參考資料[3]所述。
兩種安裝方式,推薦第二種方式,可能遇到的問題比較少
編譯原始碼安裝(不推薦)
在SDL官網https://www.libsdl.org/下載最新原始碼包SDL2-2.0.9.tar.gz
tar -zxvf SDL2-2.0.9.tar.gz
cd SDL2-2.0.9/
./configure --prefix=/home/think
make
make install
通過編譯原始碼安裝的方式,編譯安裝成功後執行ffplay可能會遇到挺多問題,參“六、問題描述”
通過軟體源線上安裝(推薦)
opensuse平臺:
zypper install libSDL2-devel
zypper install libSDL2_image-devel
zypper install libSDL2_mixer-devel
zypper install libSDL2_ttf-devel
zypper install libSDL2_gfx-devel
ubuntu平臺:
apt-get install libsdl2-dev
apt-get install libsdl2-image-dev
apt-get install libsdl2-mixer-dev
apt-get install libsdl2-ttf-dev
apt-get install libsdl2-gfx-dev
6. ffmpeg
在ffmpeg官網https://www.ffmpeg.org/下載最新版原始碼ffmpeg-4.1.tar.bz2
tar -jxvf ffmpeg-4.1.tar.bz2
cd cd ffmpeg-4.1/
./configure --prefix=/home/think --enable-shared --enable-static --enable-libx264 --enable-libx265 --enable-gpl --enable-pthreads --extra-cflags=-I/home/think/include --extra-ldflags=-L/home/think/lib
make
make install
五、測試
在命令列中執行如下測試命令:
ffmpeg -i bigbuckbunny_480x272.h265 bigbuckbunny_480x272.mp4
ffplay 128x128.264
ffprobe 128x128.264
注意:
遠端終端處於控制檯命令列模式(執行級別3),無許可權呼叫SDL,因此無法測試ffplay,但可以測試ffmpeg和ffprobe。測試ffplay需要X11控制檯模式(執行級別5,即GUI圖形模式)。
六、問題記錄
1. No available video device
錯誤提示:
Could not initialize SDL - No available video device
(Did you set the DISPLAY variable?)
原因分析:
參考資料[4]https://blog.csdn.net/huanghai381/article/details/51777446
解決方法:
a) 安裝x11的庫檔案:
opensuse平臺:
zypper install libX11-devel
zypper install xorg-x11-devel
ubuntu平臺:
apt-get install libx11-dev
apt-get install xorg-dev
b) 重新編譯安裝SDL
2. Audio target 'pulse' not available
錯誤提示:
Could not initialize SDL - Audio target 'pulse' not available
(Did you set the DISPLAY variable?)
原因分析:
參考資料[5]http://forums.libsdl.org/viewtopic.php?t=7609
解決方法:
a) 安裝缺少的庫
opensuse平臺:
zypper install libpulse-devel
zypper install libasound2
zypper install libasound2-devel // 實測不安裝此包也無問題,若軟體源中無此包則不必安裝
ubuntu平臺:
apt-get install libpulse-dev
apt-get install libasound2
apt-get install libasound2-dev
b) 重新編譯安裝SDL
3. x265 not found using pkg-config
錯誤提示:
編譯ffmpeg,執行./configure --enable-libx265 ...
出現如下錯誤提示:
x265 not found using pkg-config
原因分析:
參考資料[5]http://forums.libsdl.org/viewtopic.php?t=7609
解決方法:
export PKG_CONFIG_PATH=/home/think/lib/pkgconfig:$PKG_CONFIG_PATH
七、參考資料
[1] “ffmpeg編譯”, https://blog.csdn.net/season_hangzhou/article/details/24399371
[2] “ffmpeg編譯”,https://www.cnblogs.com/HongyunL/p/5243096.html
[3] “ffmpeg編譯未生成ffplay”, http://blog.chinaunix.net/uid-11344913-id-3936227.html
[4] “SDL失敗:無有效視訊裝置”,https://blog.csdn.net/huanghai381/article/details/51777446
[5] “SDL失敗:無有效音訊裝置”,http://forums.libsdl.org/viewtopic.php?t=7609
[6] “x265 not found using pkg-config”,https://stackoverflow.com/questions/51918409/compiling-ffmpeg-x265-not-found-using-pkg-config
[7] “configure, pkg-config”,https://www.cnblogs.com/wliangde/p/3807532.html
[8] “Yasm”, https://zh.wikipedia.org/wiki/Yasm
[9] “NASM”, https://zh.wikipedia.org/wiki/Netwide_Assembler
八、修改記錄
2018-11-20 1.0 初稿