文章主要內容介紹
本文主要描述了FFmpeg開發環境的配置。除了FFmpeg依賴的安裝和FFmpeg源碼的編譯的內容,還有如何編譯我們自己編寫的FFmpeg程序。
如果你需要對基於FFmpeg的小程序進行編譯、測試的時候,本文可以幫到你。
本文編譯的過程不需要使用那些大型的IDE,你只需要vi或vim即可。
文章目錄
寫本文檔時的配置環境
FFmpeg版本: 4.1
ysam版本: 1.3.0
zlib版本: 1.2.8
一、安裝FFmpeg前準備
1.安裝yasm編譯器
FFmpeg爲了提升效率使用了彙編指令,如MMX和SSE等,所以需要安裝彙編編譯器yasm。
官網下載:下載地址
手動安裝:
tar -xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure
make
make install
2.安裝zlib
zlib 適用於數據壓縮的函式庫,是一個無損數據壓縮庫。
cd zlib-1.2.8/
./configure
make
make check
make install
注意:
make check
進行檢查,要全部爲OK。
二、編譯FFmpeg
不需要安裝,之後需要用到FFmpeg的共享庫或靜態庫,所以要先編譯。
官網下載:下載地址
手動安裝:
cd ffmpeg-4.1/
./configure --enable-shared --prefix=/usr/local/ffmpeg
make
注意:
make
用於編譯FFmpeg源碼,生成庫文件,編譯花費的時間較多,耐心等待。
./configure
用來配置make
編譯信息和make install
程序安裝目錄等,不能省略。
如果你想要安裝FFmpeg,請看文章末尾“參考引用”的第二條。
三、編寫Makefile進行FFmpeg程序的編譯
1.FFmpeg所需要的開發環境配置項
這裏我們先看一下一個基於FFmpeg開發的項目需要配置哪些內容,之後會寫一個Makefile的例子。
注: Makefile並不是必要的,比較簡單的程序在終端輸入gcc語句一步步編譯也是可以的,但是使用Makefile能使這個過程變得簡單很多。
1.1 配置頭文件目錄
配置語句:
-I ./ffmpeg頭文件所在目錄/
1.2 配置庫文件目錄
如果你需要將程序在其它機器上運行測試,使用鏈接靜態庫會比較方便,不過靜態庫鏈接相比起採用動態鏈接庫的程序,在體積上通常會更大。
①鏈接動態庫
動態庫路徑指定:使用-l指定庫名稱,使用-L指定庫的的查找路徑。
-l庫名稱 -L./ffmpeg庫所在目錄/
②連接靜態庫
靜態庫路徑指定:使用-static表示優先鏈接靜態庫,使用-l指定庫名稱,使用-L指定庫的的查找路徑。
配置語句:
-static -l庫名稱 -L./ffmpeg庫所在目錄/
2.Makefile示例
按上面配置的思路,將編譯語句寫入Makefile,方便項目編譯。
此Makefile我直接放在 你開發的FFmpeg項目的根目錄 下,Makefile文件示例如下:
1.將編譯好的FFmpeg源碼文件夾複製到項目中。
(放在項目外也沒問題,之後會進行文件夾路徑的配置;但是如果放在項目外,如果你移動了項目文件,將需要重新配置FFmpeg源碼文件夾的路徑)
2.新建並編寫Makefile文件:vim Makefile
#說明:
#【假設我們要編譯的文件是ffmpegTest.c】
#【】
#‘cc’等價與‘gcc’,用於編譯鏈接.c文件
#-static利用靜態庫編譯,如果你需要
#-I指定頭文件目錄
#-L指定庫文件目錄
#-l指定庫名
#配置頭文件目錄
INCLUDES = -I./ffmpeg-4.1/
COMPILE_OPTS = ${INCLUDES}
C_FLAGS = ${COMPILE_OPTS} -W -Wall -O3
#配置庫目錄
LIB_DIR = ./ffmpeg-4.1/
#定義PROGRAM_NAME變量
#用於存儲 我們要編譯的代碼文件的文件名
PROGRAM_NAME= ffmpegTest
#定義其他變量,如果你需要在一個項目中編譯多個C/C++文件,這會很有用
#但是本例子中,並沒有突出這些變量的作用
#SOURCES保存要編譯的代碼文件名;
#OBJECTS保存編譯出的文件名;
#PROGRAM保存鏈接出來可執行文件名(即,最終我們要得到的程序)
SOURCES= $(PROGRAM_NAME).c
OBJECTS= $(PROGRAM_NAME).o
PROGRAM= $(PROGRAM_NAME)
all:$(PROGRAM)
#將.c文件編譯,生成對應.o對象文件
.c.o:
cc -c ${C_FLAGS} $<
#將.o對象文件和庫進行鏈接,生成程序文件
$(PROGRAM_NAME) :$(PROGRAM_NAME).o
cc -o $@ $< -static -lavformat -L${LIB_DIR}libavformat/
-lavdevice -L${LIB_DIR}libavdevice/
-lavcodec -L${LIB_DIR}libavcodec/
-lavutil -L${LIB_DIR}libavutil/
-lpthread -ldl -lswscale -L${LIB_DIR}libswscale/
-lswresample -L${LIB_DIR}libswresample/
-lz -lm -lrt
#用於清理編譯鏈接生成的文件
clean:
$(RM) $(PROGRAM) $(OBJECTS)
3.進行項目編譯
保存Makefile文件之後,到Makefile所在的目錄,在終端輸入make
即可進行編譯,此時會輸出編譯的語句,如果出現錯誤提示可以進行對應的修改。
有些錯誤是因爲之前編譯出的文件有問題,如果出現錯誤,最好先將上次編譯的文件刪除,可以使用make clean
。
四、可能出現的錯誤
1.問題:libxxxx/xxxx.h:沒有那個文件或目錄
出現此問題是因爲找不到頭文件。
解決方法:
按之前的說明編寫,仔細檢查。
2.問題:找不到 -lxxxx
出現此問題是因爲找不到so庫。
解決方法:
按之前的說明,仔細檢查。
3.問題:找不到avconfig.h
libavutil/avconfig.h是自動生成的,所以可能FFmpeg源文件夾中會沒有這個文件。/* Generated by ffconf */
解決方法:
可能需要對源代碼先編譯,也可以從其它項目拷貝到libavutil文件夾中。
4.問題:對‘ABC’未定義的引用
出現此問題是因爲FFmpeg是C庫,在編譯爲可執行文件時需要具體的實現,這裏未正確使用g++造成庫無法鏈接上,也就導致無法找到。
解決方法:
將文件類型改爲.c,編譯工具改用gcc。
5.問題:找不到lz
出現這個問題就是因爲缺少zlib庫。
解決方法:
只需要重新安裝就可以了。
6.之後的編譯錯誤請補充在此處
需補充錯誤描述,截圖,解決方法。
五、記錄註解
1.隨着ffmpeg代碼版本更新,API接口名稱會有更新,可查看ffmpeg\doc\ APIchanges 文件確定名稱變更記錄;
2.如果程序使用動態庫鏈接,可用ldd查看程序的動態庫依賴;