本节的目的是在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.def
make
make 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/ffmpeg
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure --prefix=/home/Administrator/ffmpeg/build/libfdk-aac --enable-static --enable-shared
make -j4
make install
3.3下载编译mp3
cd /home/Administrator/ffmpeg
git clone --depth 1 https://gitee.com/hqiu/lame.git
cd 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为1
qputenv("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 += ../include
LIBS += -L../lib \
-lavcodec \
-lavdevice \
-lavfilter \
-lavformat \
-lavutil \
-lpostproc \
-lswresample \
-lswscale
这样就能将.h文件 引入,将动态库索引引入。
在执行的时候,还是会遇到 找不到各种dll的问题。
因此还需要将真正的dll文件放在 程序运行的exe 同一目录下