本節的目的是在windows 上 編譯 ffmpeg 源碼,這樣做的目的是:在工作中可以根據工作的實際內容裁剪 ffmpeg,或者改動 ffmpeg 的源碼。
第一步 :下載, 安裝,配置 ,運行 msys64
下載?
安裝 配置

配置-修改pacman的源 - 在最新的msys64中已經不用改動,改動后反而有錯誤

Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
運行?msys2_shell.cmd -mingw64
1. 啟動命令?窗?,在窗?中輸?:
在cmd模式下 進?msys2安裝?錄cd c:\msys64
#如果要打開msys2的mingw64窗?
msys2_shell.cmd -mingw64
#如果要打開msys2的msys窗?
#msys2_shell.cmd

2. 然后在msys2的shell中執?:

二 安裝編譯環境
1??編譯工具鏈
pacman -S mingw-w64-x86_64-toolchain

2? 編譯工具
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S libtool
pacman -S mingw-w64-i686-cmake
pacman -S pkg-config
pacman -S mingw-w64-x86_64-SDL2
pacman -S mingw-w64-x86_64-yasm
pacman -S nasm
查看結果 which cl link yasm cpp
3? 編譯第三?庫
Administrator@DESKTOP-SU7G9P3 MINGW64 ~
# pwd
/home/Administrator
mkdir ffmpeg
cd ffmpeg
3.1 下載x264,生成動態庫文件,靜態庫文件
git clone http://git.videolan.org/git/x264.git
cd進入到 x264 目錄下
cd x264
./configure --prefix=/home/Administrator/ffmpeg/build/libx264 --host=x86_64-w64-mingw32 --enable-shared --enable-static --extra-ldflags=-Wl,--output-def=libx264.defmakemake install



cd /home/Administrator/ffmpeg/build/libx264/lib
#若要生成64位lib文件則輸入如下命令:
lib?/machine:X64 /def:libx264.def
#若要生成32位lib文件則輸入如下命令:
lib?/machine:i386 /def:libx264.def
緣由:因為要借助mingw64來編譯一個第三方庫,需要編譯成Windows所需的lib文件,其中執行到一條命令:lib /machine:X64 /def:libx264.def結果出現錯誤:bash: lib command not found最開始以為是libtool出了問題,后來發現整個msys64目錄下沒有lib.exe,然后就想到了Visual Studio自帶的lib.exe。解決辦法:把Visual Studio自帶lib.exe的所在目錄添加到環境變量Path當中

請注意上面是64位的,請注意要根據實際路徑來添加。
添加完畢之后,記得要重啟mingw64
然后使用cmd 命令,進入到C:\msys64new\home\Administrator\ffmpeg\build\libx264\lib
執行? lib /machine:X64 /def:libx264.def
3.1.1?制作3rd庫
新建lib264文件夾,拷貝libx264-158.dll 到文件夾下,并命名為libx264.dll?新建include和lib目錄,分別將x264.h、x264_config.h拷貝到include目錄,libx264.lib拷貝到lib目錄下
3.2 下載和編譯fdk-aac
下載fdk-aac
cd /home/Administrator/ffmpeggit clone --depth 1 https://gitee.com/mirrors/fdk-aac.gitcd fdk-aac./autogen.sh./configure --prefix=/home/Administrator/ffmpeg/build/libfdk-aac --enable-static --enable-sharedmake -j4make install

3.3下載編譯mp3
cd /home/Administrator/ffmpeggit clone --depth 1 https://gitee.com/hqiu/lame.gitcd lame./configure --prefix=/home/Administrator/ffmpeg/build/libmp3lame --disable-shared --disable-frontend --enable-static
make
make install
3.4 下載編譯libvpx
cd /home/Administrator/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/Administrator/ffmpeg/build/libvpx --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j4
make install
4.下載和編譯ffmpeg

./configure \
--prefix=/home/Administrator/ffmpeg/build/ffmepg-7.0 \
--arch=x86_64 \
--enable-shared \
--enable-gpl \
--enable-libfdk-aac \
--enable-nonfree \
--enable-libvpx \
--enable-libx264 \
--enable-libmp3lame \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libfdk-aac/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libfdk-aac/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libvpx/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libvpx/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libx264/include" \
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libx264/lib" \
--extra-cflags="-I/home/Administrator/ffmpeg/build/libmp3lame/include"\
--extra-ldflags="-L/home/Administrator/ffmpeg/build/libmp3lame/lib"
此時bin目錄中的ffmpeg、ffprobe、ffplay還是沒法使用的,因為缺少相關的dll,需要從%MSYS2_HOME%/mingw64/bin中拷貝,或者將%MSYS2_HOME%/mingw64/bin配置到環境變量Path中。
需要拷貝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2? ,? libva_win32.dll
從?C:\msys64new\mingw64\bin 中拷貝數據到?C:\msys64new\home\Administrator\ffmpeg\build\ffmepg-7.0\bin

三,另一種安裝方案。
參考博客如下:
https://www.cnblogs.com/mjios?page=3
下載安裝MSYS2
進入MSYS2官網下載安裝包(我這邊下載的是:msys2-x86_64-20210228.exe),然后進行安裝。
安裝完畢后打開命令行工具mingw64.exe。
安裝依賴
pacman(Package Manager)是一個包管理工具。
- pacman -Sl:搜索有哪些包可以安裝
- pacman -S:安裝
- pacman -R:卸載
# 編譯工具鏈
pacman -S mingw-w64-x86_64-toolchain
?
pacman -S mingw-w64-x86_64-yasm
?
pacman -S mingw-w64-x86_64-SDL2
?
pacman -S mingw-w64-x86_64-fdk-aac
?
pacman -S mingw-w64-x86_64-x264
?pacman -S mingw-w64-x86_64-x265? 這個不會有build error ,但是執行的時候,提示x265.dll找不到 中的某一個路徑找不到,因此也不安裝了
pacman -S mingw-w64-x86_64-libmp3lame? 這個好像不行,使用pacman -Sl 查找并沒有libmp3lame相關的,有一個是?mingw-w64-x86_64-gimp3,但是不知道是否就是libmp3lame,這應該也是為什么在這種安裝方式下,參考中的博客沒有將mp3弄進去的原因
?
# 需要單獨安裝make
pacman -S make
關于軟件包相關的默認路徑:
下載目錄:%MSYS2_HOME%/var/cache/pacman/pkg
安裝目錄:%MSYS2_HOME%/mingw64
%MSYS2_HOME%是指MSYS2的安裝目錄
cd /C/msys64new/home/Administrator/ffmpeg/ffmpeg-7.0
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl ?--enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265
按照 如上有運行時異常,總是說libx265.dll有問題,錯誤如下,
這塊找了好久也沒有找到方案解決,因此直接 將 --enable-libx265 刪除了,重新build 了一版?
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --enable-gpl ?--enable-nonfree --enable-libfdk-aac --enable-libx264
此時bin目錄中的ffmpeg、ffprobe、ffplay還是沒法使用的,因為缺少相關的dll,需要從%MSYS2_HOME%/mingw64/bin中拷貝,或者將%MSYS2_HOME%/mingw64/bin配置到環境變量Path中。
需要拷貝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2? ,? libva_win32.dll
從?C:\msys64new\mingw64\bin 中拷貝數據到?C:\msys64new\usr\local\ffmpeg\bin

總結:
將 C:\msys64new\mingw64\bin 中的相關dll 拷貝到C:\msys64new\usr\local\ffmpeg\bin
將C:\msys64new\usr\local\ffmpeg\bin 設置為環境變量
四,安裝QT,以及配置QT
下載
本教程中選擇5.14.2版本(從5.15版本開始是收費版本)。
- 下載地址:Index of /archive/qt/5.14/5.14.2
- Windows系統選擇下載:qt-opensource-windows-x86-5.14.2.exe
勾選MinGW 64bit編譯器(我電腦的系統是64bit)。
如果后期想閱讀Qt源碼,就選擇勾選Qt源碼。
默認已經勾選了QtCreator。
解決控制臺中文亂碼
工具 -> 選項
文本編輯器 -> 行為 -> 文本編碼 -> 默認編碼。
每次運行Qt程序,你的控制臺可能都會出現以下警告信息:QT_DEVICE_PIXEL_RATIO已經過期。
Warning: QT_DEVICE_PIXEL_RATIO is deprecated. Instead use:QT_AUTO_SCREEN_SCALE_FACTOR to enable platform plugin controlled per-screen factors.QT_SCREEN_SCALE_FACTORS to set per-screen DPI.QT_SCALE_FACTOR to set the application global scale factor.
解決方案:設置環境變量QT_SCALE_FACTOR為1即可。
#include "mainwindow.h"#include <QApplication>// 導入頭文件【也可以不導入,因為<QApplication>中已經包含了<QByteArray>】
// #include <QByteArray>int main(int argc, char *argv[]) {// 通過qputenv函數設置QT_SCALE_FACTOR為1qputenv("QT_SCALE_FACTOR", QByteArray("1"));QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
集成FFmpeg到Qt項目中
在Windows中,我們最終是通過調用FFmpeg動態庫(dll)中的函數來操作音視頻數據,使用dll的其中一種方式是需要用到3種文件:
- .h:頭文件(Header File)
- 包含了函數的聲明
- 通過#include去導入相應的頭文件
- .dll:動態鏈接庫(Dynamic Link Library)
- 包含了函數的具體實現代碼
- Windows程序會在運行過程中,動態調用dll中的函數
- .lib或.dll.a:(動態鏈接庫的)導入庫(Import Library)
- .lib:用于MSVC編譯器中
- .dll.a:用于MinGW編譯器中
- 包含了dll中函數的入口,用于輔助找到并調用dll中的函數
- 最終需要鏈接到Windows程序中(比如合并到exe文件中)
值得一提的是,在Windows中,靜態鏈接庫(Static Link Library)的擴展名也是.lib、.dll.a。靜態鏈接庫和導入庫的區別是:
- 靜態鏈接庫:包含了函數的具體實現代碼
- 導入庫:不包含函數的具體實現代碼(函數的具體實現代碼存儲在dll中)
修改.pro文件
# 設置頭文件的目錄,以便編譯器能夠找到頭文件
INCLUDEPATH += %FFMPEG_HOME%/include
# 設置導入庫的目錄和需要鏈接的導入庫
LIBS += -L%FFMPEG_HOME%/lib \-lavcodec \-lavdevice \-lavfilter \-lavformat \-lavutil \-lpostproc \-lswscale \-lswresample
#號后面的內容是注釋
%FFMPEG_HOME%表示ffmpeg-4.3.2-2021-02-27-full_build-shared.7z解壓后的目錄
需要根據你的實際情況修改為真實的路徑
-L:設置導入庫的目錄,以便編譯器能夠找到導入庫
-l:設置需要鏈接的導入庫名稱
導入庫名稱需要去掉文件名前面的lib,比如libavcodec.dll.a就寫成avcodec
調用函數
在main.cpp中調用av_version_info函數,獲取FFmpeg的版本信息。
#include "mainwindow.h"#include <QApplication>// 為了使用qDebug函數
#include <QDebug>// FFmpeg是C語言庫
// 有了extern "C",才能在C++中導入C語言函數
extern "C" {
#include <libavcodec/avcodec.h>
}int main(int argc, char *argv[]) {// 打印版本信息qDebug() << av_version_info();QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
拷貝dll文件
Qt程序編譯成功后,會生成一個exe文件exe是Windows中的一種可執行文件
我們編寫的程序代碼最終都存在了exe文件中
為了保證exe在運行時能成功調用FFmpeg的函數,那么就得讓exe能夠找到FFmpeg的dll文件(動態庫文件)。可以將%FFMPEG_HOME%/bin目錄中的所有dll文件拷貝到exe文件所在的目錄中,exe在運行的時候,能自動找到跟它同一目錄下的dll文件。
可以通過查看構建目錄得知exe文件所在的目錄。
運行程序后,如果能在控制臺看到當前ffmepg 的版本信息?字樣的輸出信息,說明FFmpeg已經集成成功。
問題記錄:
這里實際測試中還有一個問題,先記錄一下,但是原因暫時不知道:
實際開發中 只有使用 MinGW 64-bit這個才能build pass,并運行成功,使用其他的三個都有build error
假設我們開發好程序要給 user 的windows電腦上使用,那么user是不一定裝過ffmpeg,或者SDL的,因此我自己覺得好的做法,應該是如下的
INCLUDEPATH += ../include
DEPENDPATH += ../includeLIBS += -L../lib \-lavcodec \-lavdevice \-lavfilter \-lavformat \-lavutil \-lpostproc \-lswresample \-lswscale
這樣就能將.h文件 引入,將動態庫索引引入。
在執行的時候,還是會遇到 找不到各種dll的問題。
因此還需要將真正的dll文件放在 程序運行的exe 同一目錄下