基於FFmpeg程序開發的環境配置(Linux下利用Makefile進行配置)

文章主要內容介紹

本文主要描述了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 適用於數據壓縮的函式庫,是一個無損數據壓縮庫。

官網下載:下載地址
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查看程序的動態庫依賴;

六、參考引用

1.linux下Zlib的安裝與使用

2.linux 下安裝ffmpeg 遇到問題處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章