在vs2017中通過CMake 配置ffmpeg 環境

ffmpeg工具包和本篇測試代碼在如下

鏈接:https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA 
提取碼:5ndl 

先用CMkae創建一個項目,之後在該項目中配置ffmpeg

項目創建成功後,解壓ffmpeg工具包

解壓之後,有3個文件夾

配置CMakeLists.txt

在創建的項目中,找到CMakeLists.txt

這個CMakeLists.txt類似於java中的build.gradle文件,功能是告知Cmake.exe工具要如何去構建當前項目

1.先配置ffmpeg頭文件的根目錄

我們想要使用ffmpeg中提供的函數,那麼就要確定頭文件的位置。ffmpeg中的頭文件都是放在include中,因此,我們可以在CMakeLists.txt中配置include的路徑。配置代碼的第5行

cmake_minimum_required (VERSION 3.8)

#能夠在 編碼的時候 使用ffmpeg的函數
# 設置頭文件的查找位置
include_directories("D:/ffmpeg-20180813-551a029-win64-dev/include")

# 將源代碼添加到此項目的可執行文件。
add_executable (CMakeProject4 "CMakeProject4.cpp" "CMakeProject4.h")

2.配置ffmpeg庫的根目錄

除了配置頭文件之外,ffmpeg自身的函數也調用了某些庫,這些庫都放在lib文件夾裏,因此我們還要配置這些庫的根目錄

庫的配置看第8行

cmake_minimum_required (VERSION 3.8)

#能夠在 編碼的時候 使用ffmpeg的函數
# 設置頭文件的查找位置
include_directories("D:/ffmpeg-20180813-551a029-win64-dev/include")

# 設置庫的查找目錄 jar
link_directories("D:/ffmpeg-20180813-551a029-win64-dev/lib")

# 將源代碼添加到此項目的可執行文件。
add_executable (CMakeProject4 "CMakeProject4.cpp" "CMakeProject4.h")

3.設置我們程序將要鏈接的ffmpeg庫

源代碼變爲可執行程序,需要經過編譯-鏈接,兩個步驟。編譯好理解,就是將源代碼翻譯成機器指令,而鏈接是將其他編譯好的機器指令和我們自己的機器指令進行結合.,這裏的其他編譯好的機器指令其實指的就是庫,因爲庫中的代碼都是經過編譯的。

因爲我們的程序引用到了ffmpeg中的代碼,所以在鏈接的時候也要鏈接ffmpeg中的庫,在lib文件下

凡是以lib結尾的文件都是ffmpeg的庫,我們在CMakeLists.txt中,看16行,將這些庫都引入

#設置編譯鏈接的庫 ffmpeg

cmake_minimum_required (VERSION 3.8)

#能夠在 編碼的時候 使用ffmpeg的函數
# 設置頭文件的查找位置
include_directories("D:/ffmpeg-20180813-551a029-win64-dev/include")

# 設置庫的查找目錄 jar
link_directories("D:/ffmpeg-20180813-551a029-win64-dev/lib")

# 將源代碼添加到此項目的可執行文件。
add_executable (CMakeProject4 "CMakeProject4.cpp" "CMakeProject4.h")

#設置編譯鏈接的庫 ffmpeg
target_link_libraries( CMakeProject4 avutil avcodec avfilter  avdevice avformat postproc swresample )

這裏需要注意的是target_link_libraries 中的 CMakeProject4  和add_executable 中的CMakeProject4 名字要一樣,這表示要將這些庫都集成到add_executable 生成的CMakeProject4.exe這個可執行文件中。

4將ffmpeg的dll拷貝到C:\Windows\System32

最後將dll中的所有dll文件拷貝到C:\Windows\System32

到此,ffmpeg的環境算是配置完成了,接下來,就通過代碼來驗證下,我們是否配置成功

完整測試代碼如下

#include "CMakeProject4.h"

using namespace std;
extern "C" {
	#include <libavcodec/avcodec.h>
	#include <libavformat/avformat.h>
}


int main()
{
	//輸出版本號
	cout << av_version_info() << endl;
	cout << "Hello CMake。" << endl;
    system("pause");
	return 0;
}

看到如下結果,說明配置成功

這裏做個解釋

extern c

由於ffmpeg是純C代碼寫的,但當前我們的項目環境又是C++,在C++中引入C語言的頭文件,一定要將.h用extern C包裹,包裹後,編譯在編譯頭文件中的內容時,纔會以C語言的標準去編譯頭文件,如果不用extern c 包裹,那麼編譯會以C++的標準編譯頭文件。

av_version_info()

是ffmpeg中的一個函數,若有輸出內容,說明我們配置成功了。

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