《FFmpeg原理》的社群來了,想加入社群的朋友請購買?VIP?版,VIP 版有更高級的內(nèi)容與答疑服務(wù)。
《window10_ffmpeg調(diào)試環(huán)境搭建-極速版》已經(jīng)介紹了在qt creator里面 調(diào)試ffmpeg.c 工程。但是極速版的dll是現(xiàn)成的。所以本文來講解如何自己編譯出ffmpeg的dll。
window10 環(huán)境下 ffmpeg的編譯方式主要有以下2種:
1,MSYS2 + MinGW
2,MSYS2 + MSVC
由于 window 的原生 CMD 命令行無法執(zhí)行shell腳本,也沒有 make 之類的命令,所以需要裝 MSYS2 軟件。
MSYS2 是什么?MSYS2 實際上就是一個linux 仿真環(huán)境,裝了 MSYS2 就可以運行 ffmpeg 的configure 編譯腳本了。
MinGW 跟 MSVC 是兩個不同的編譯器,MinGW 編譯器有什么優(yōu)勢?請看下面代碼
/*linux api pthread_create()*/
#include <stdio.h>
#include <pthread.h>
void* PrintHello(void* data)
{
printf("Hello from new thread\n");
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
pthread_t thread_id;
pthread_create(&thread_id, NULL, PrintHello, NULL);
pthread_exit(NULL);
}
上面的代碼使用了一個 linux 里面 pthread_create() 線程函數(shù),在window 環(huán)境是沒有這個線程函數(shù)的,如果用 MSVC 編譯器編譯,會報錯。
但是如果用 MinGW 編譯器 就可以在window環(huán)境 編譯 pthread_create() 的代碼。
fmpeg 的源代碼是 linux ,window 等多平臺通用的,ffmpeg 里面并沒有直接使用 pthread_create() 之類的linux專屬的api函數(shù),所以 用MinGW 還是MSVC 都可以編譯ffmpeg 的源碼,ffmpeg 的configure 編譯腳本根據(jù)不同的編譯方式執(zhí)行不同的編譯邏輯,例如如果用MinGW的編譯器,configure 里面會走 MinGW的那塊編譯邏輯,如果指定用 MSVC 編譯,configure會走另一塊邏輯。
通過在configure前面加 --toolchain=xxx 可以指定不同的編譯工具鏈,例如 --toolchain=msvc 是指定msvc 編譯工具鏈, 如果沒指定 --toolchain ,在mingw32環(huán)境下,configure會自動選擇 MinGW 的方式編譯,我們本文的示例就沒指定 --toolchain。
所以,與其說ffmpeg 的代碼是跨平臺的,不如說是 configure 這個shell腳本實現(xiàn)了不同平臺的編譯規(guī)則。因為 window 原生 CMD 命令行沒法運行shell腳本,所以就需要 MSYS2。
本文主要講解 MSYS2 + MinGW 的編譯方法,MSYS2 + MSVC 后續(xù)再會出一篇文章詳細講解。
MSYS2 官網(wǎng)下載地址:MSYS2
MSYS2 安裝完成之后,CMD 進入安裝目錄 C:\msys64 目錄,執(zhí)行?.\msys2_shell.cmd?-mingw32
,打開32位的環(huán)境。不要直接點擊?mingw32.exe
?進入32位環(huán)境。盡量用?.\msys2_shell.cmd -mingw32
。因為后面會改動一下?msys2_shell.cmd
?文件。
運行之后就會進入 linux 的仿真環(huán)境,ls
,ps
,等linux命令都可以使用。
.\msys2_shell.cmd?-mingw32
?是 64位的環(huán)境,用這個入口編譯出來的 ffmpeg.exe 跟 DLL 默認是 64位的。本文先編譯 32 位的程序,64位后續(xù)出一篇文章講解。
MSYS2 Linux仿真環(huán)境中包管理命令是 pacman,類似 apt-get,yum。下面用 pacman 安裝一些用來編譯 FFmpeg 的軟件。(pacman 下載速度慢需要切換源)
# 刷新軟件包數(shù)據(jù)
pacman -Sy
# 安裝mingw-w64 ,如果報錯 signature not trust,請看下面解決。
pacman -S mingw-w64-i686-toolchain
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S mingw-w64-i686-SDL2
pacman -S libtool
pacman -S mingw-w64-i686-cmake
pacman -S pkg-config
pacman -S yasm
# 編譯x264 需要 nasm
pacman -S nasm
常見錯誤:
-
mingw-w64-i686-toolchain
?如果按照報 "signature not trust "錯,是證書過期了,直接禁用檢測,請參考此文章解決。?csdn文章
準備工作已經(jīng)完畢了。
FFmpeg 這個工程編解碼等功能,是需要依賴一些外部庫的,例如 x264庫,aac庫等等。所以編譯FFmpeg之前,需要把 x264 ,acc 等項目編譯出靜態(tài)庫,然后再把x264靜態(tài)庫,acc靜態(tài)庫等 Link 進去 FFmpeg 的DLL里面。
x264 項目編譯:
下面的命令請把 /home/loken 改成自己的目錄。
編譯過程中如果報 final link failed: No space left on device 錯誤,嘗試重啟window10。
# 回到用戶目錄
cd /home/loken
# 創(chuàng)建ffmpeg目錄,build目錄,統(tǒng)一管理
mkdir -p ffmpeg/build32
# 進入ffmpeg目錄
cd ffmpeg
#下載x264項目代碼
git clone https://gitee.com/mirrors_addons/x264
# 進入x264項目目錄
cd x264
# 執(zhí)行configure
./configure --prefix=/home/loken/ffmpeg/build32/libx264 \
--host=i686-w64-mingw32 --enable-static \
--extra-ldflags=-Wl,--output-def=libx264.def
make -j8
make install
如果上面的命令沒出錯,在?~/ffmpeg/build32/libx264/lib
?目錄下會編譯出 x264 的靜態(tài)庫?libx264.a
。
fdk-aac項目編譯:
# 回到ffmpeg目錄
cd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure --prefix=/home/loken/ffmpeg/build32/libfdk-aac --disable-shared \
--enable-static
make -j8
make install
如果上面的命令沒出錯,在?~/ffmpeg/build32/libfdk-aac/lib
?目錄下會編譯出 aac 的靜態(tài)庫?libfdk-aac.a
。
mp3項目編譯:
下面的命令如果報錯,請把 "~" 相對目錄 改成絕對目錄
cd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/hqiu/lame.git
cd lame
./configure --prefix=/home/loken/ffmpeg/build32/libmp3lame --disable-frontend \
--disable-shared --enable-static
make -j8
make install
如果上面的命令沒出錯,在?~/ffmpeg/build32/libmp3lame/lib
?目錄下會編譯出 mp3 的靜態(tài)庫?libmp3lame.a
。
libvpx項目編譯:
cd /home/loken/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/loken/ffmpeg/build32/libvpx --disable-examples \
--disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j8
make install
如果上面的命令沒出錯,在?~/ffmpeg/build32/libvpx/lib
?目錄下會編譯出 vpx的靜態(tài)庫?libvpx.a
。
FFmpeg 工程依賴的外部靜態(tài)庫都已經(jīng)編譯出來,下面可以開始編譯 FFmpeg 工程了。
FFmpeg項目編譯:
下載 ffmpeg 4.2 源碼,鏈接:百度網(wǎng)盤 請輸入提取碼?提取碼:g3k8
把文件?FFmpeg-4.2.zip
?解壓到 /home/loken/ffmpeg/ffmpeg
cd /home/loken/ffmpeg/ffmpeg-4.2
./configure \
--prefix=/home/loken/ffmpeg/build32/ffmepg-4.2 \
--enable-gpl \
--enable-sdl2 \
--enable-zlib \
--enable-shared \
--enable-nonfree \
--enable-libx264 \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libvpx \
--extra-cflags="-I/home/loken/ffmpeg/build32/libfdk-aac/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libfdk-aac/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libvpx/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libvpx/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libx264/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libx264/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build32/libmp3lame/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build32/libmp3lame/lib"
make -j8
make install
編譯完成之后,build32/ffmpeg-4.2 目錄如下:
可以看到 ffmpeg.exe 已經(jīng)編譯出來了。這個時候 在MSYS2 仿真linux命令行里,ffmpeg.exe 是可以運行的。如圖。
但是如果在window CMD 命令行運行 ffmpeg.exe ,會報錯,提示缺少 libwinpthread-1.dll 等庫。
把?C:\msys64\mingw32\bin\libwinpthread-1.dll
?復(fù)制到?\home\loken\ffmpeg\build32\ffmepg-4.2\bin
?。其他缺少的 dll 文件也是如此操作。
拷貝完缺少的dll文件后,再運行 ffmpeg.exe 就不會報錯了。
重要知識點:
- 如何查看exe ,dll 的是 32位 還是 64位 ? 解答:dumpbin.exe /headers ffmpeg.exe
MSYS2 環(huán)境下 ffmpeg 的編譯已經(jīng)講完了,下面介紹QT 如何調(diào)用 FFmpeg 的 api 函數(shù)。
之前編譯ffmpeg 的時候,configure 指定了 --enable-shared,所以項目生成了幾個DLL動態(tài)庫。
- avcodec-58.dll 編解碼API。
- avdevice-58.dll 設(shè)備API。
- avfilter-7.dll 濾鏡API
- avformat-58.dll 容器API。
- 等等。
下面介紹 QT 項目如何加入這些dll。如果之前沒裝過 qt 跟 Visual Studio 2015 請看第一篇文章。
1,打開Qt creator,點擊New File Or Project,選擇 Non-Qt Project ,選擇 Plain C Application。
2,勾選編譯環(huán)境 kit ,MinGW 32 跟 MSVC 2015 32bit。
3,把?\home\loken\ffmpeg\build32
?整個目錄拷貝到 ffmpeg-qt-version 項目目錄下。
4,修改?ffmpeg-qt-version.pro
?文件:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
?
SOURCES += main.c
?
contains(QT_ARCH, i386) {
message("32-bit")
INCLUDEPATH += $$PWD/build32/ffmepg-4.2/include
LIBS += $$PWD/build32/ffmepg-4.2/bin/avformat.lib \
$$PWD/build32/ffmepg-4.2/bin/avcodec.lib \
$$PWD/build32/ffmepg-4.2/bin/avdevice.lib \
$$PWD/build32/ffmepg-4.2/bin/avfilter.lib \
$$PWD/build32/ffmepg-4.2/bin/avutil.lib \
$$PWD/build32/ffmepg-4.2/bin/postproc.lib \
$$PWD/build32/ffmepg-4.2/bin/swresample.lib \
$$PWD/build32/ffmepg-4.2/bin/swscale.lib
} else {
message("64-bit")
}
5,修改 main.c 文件:
#include <stdio.h>
#include "libavutil/avutil.h"
int main(){
printf("Hello FFMPEG, version is %s\n", av_version_info());
return 0;
}
6,編譯運行?ffmpeg-qt-version
?項目。會提示確實缺少dll。
由于 ffmpeg-qt-version 項目并沒有用到pthread_create() 之類的 linux api 函數(shù),所以 用MinGW 32bit 還是 MSVC2015 32bit 編譯都沒問題。
7,把 build32/ffmpeg-4.2/bin/*.dll 所有DLL都復(fù)制到?build-ffmpeg-qt-version-Desktop_xxxx-Debug\debug
?目錄。然后再次編譯運行?ffmpeg-qt-version
?項目,就會正常打印出 version。
注意事項:
- 項目文件路徑不要有中文,QT 可能會報錯。
常見錯誤:
- 如果報錯找不到文件之類的,把qt 的?
build-ffmpeg-qt-version-Desktop_xxx-Debug
?目錄刪掉,因為可能有緩存,再重新執(zhí)行上面步奏。
重要知識點:
- 上面調(diào)用了 ffmpeg 的 api 函數(shù)?
av_version_info()
?打印版本號,由于 ffmpeg-qt-version 項目并沒有用到pthread_create() 之類的 linux api 函數(shù),所以 用MinGW 32bit 還是 MSVC2015 32bit 編譯都沒問題。 - 雖然我們的 avcodec-58.dll 是MinGW 編譯出來的,但是還是可以用MSVC來編譯其他的ffmpeg-qt-version 的 main.c 文件。也就是說 MinGW 編譯出來的 DLL 也是可以在 MSVC 環(huán)境中被使用的。我個人的理解是 DLL 已經(jīng)是window系統(tǒng)級別的機器碼,肯定能被 MSVC 調(diào)用。補充:這個是ABI相關(guān)知識,《ABI 與 API 的區(qū)別》
- 需要注意,MSYS2編譯ffmpeg 的gcc 版本不能跟 Qt creator里面的MinGW的gcc版本差距太大。例如MSYS2里編譯ffmpeg dll的gcc是11.0版本,而Qt creator的MinGW的gcc是 5.0,在項目里面就無法使用 ffmpeg 的dll,會報錯,應(yīng)該是gcc版本差距太大,二進制不兼容之類的。
ffmpeg 官方發(fā)布的window dll 下載:
百度網(wǎng)盤:百度網(wǎng)盤 請輸入提取碼?提取碼:n7dx
官方發(fā)布的?ffmpeg-4.2.1-win32-shared.zip
?里面的README 記錄了官方編譯ffmpeg的configure選項。里面有?-enable-lzma
?--enable-zlib
,網(wǎng)上某些ffmpeg 編譯教程,沒有加這兩個選項,每次都要復(fù)制 zlib-1.dll 過去??梢詤⒖脊俜降腸onfigure選項,直接把zlib等庫以靜態(tài)庫的方式編譯進去ffmpeg dll 更方便。
相關(guān)技術(shù)文章:文章來源:http://www.zghlxwxcb.cn/news/detail-406574.html
- ffmpeg 官方編譯文檔,CompilationGuide – FFmpeg,推薦把官方文檔細讀一遍。
- Visual Studio 2015使用入門
- 微軟軟件大全下載:MSDN I TELL YOU
- 淺談Qt的編譯方式:qmake/cmake/qbs及qbs被棄用的原因
- 《Qmake常用語法》
?版權(quán)所屬:弦外之音。 由于筆者的水平有限, 加之編寫的同時還要參與開發(fā)工作,文中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請讀者批評指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-406574.html
到了這里,關(guān)于window10_ffmpeg調(diào)試環(huán)境搭建-自己編譯的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!