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中的一個函數,若有輸出內容,說明我們配置成功了。