前面已经介绍了 如何用 MSYS2 + MinGW 编译FFmpeg 32 位程序,本文主要讲解如何用 MSYS2 + MinGW 编译 FFmpeg 64位程序。
开始安装:
1,CMD 用 .\msys2_shell.cmd -mingw64
进入 MinGw64 位环境。
2,安装所需软件
# 刷新软件包数据
pacman -Sy
# 安装mingw-w64。
pacman -S mingw-w64-x86_64-toolchain
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S mingw-w64-x86_64-SDL2
pacman -S libtool
#32位的cmake跟64位的cmake都装一下,比较保险。
pacman -S mingw-w64-i686-cmake
pacman -S mingw-w64-x86_64-cmake
pacman -S pkg-config
pacman -S yasm
# 编译x264 需要 nasm
pacman -S nasm
小技巧, pacman -Ss 关键字:在仓库中搜索含关键字的包。
准备工作已经完毕了。
FFmpeg 这个工程编解码等功能,是需要依赖一些外部库的,例如 x264库,aac库等等。所以编译FFmpeg之前,需要把 x264 ,acc 等项目编译出静态库,然后再把x264静态库,acc静态库等 Link 进去 FFmpeg 的DLL里面。
x264 项目编译:
下面的命令请把 /home/loken 改成自己的目录。
编译过程中如果报 final link failed: No space left on device 错误,尝试重启window10。
# 回到用户目录
cd /home/loken
# 创建ffmpeg目录,build64 目录,统一管理
mkdir -p ffmpeg/build64
# 进入ffmpeg目录
cd ffmpeg
#下载x264项目代码
git clone https://gitee.com/mirrors_addons/x264
# 进入x264项目目录
cd x264
# 执行configure
./configure --prefix=/home/loken/ffmpeg/build64/libx264 \
--host=x86_64-w64-mingw32 --enable-static \
--extra-ldflags="-Wl,--output-def=libx264.def"
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build64/libx264/lib
目录下会编译出 x264 的静态库 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/build64/libfdk-aac --disable-shared \
--enable-static
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build64/libfdk-aac/lib
目录下会编译出 aac 的静态库 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/build64/libmp3lame --disable-frontend \
--disable-shared --enable-static
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build64/libmp3lame/lib
目录下会编译出 mp3 的静态库 libmp3lame.a
。
libvpx项目编译:
cd /home/loken/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/loken/ffmpeg/build64/libvpx --disable-examples \
--disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j8
make install
如果上面的命令没出错,在 ~/ffmpeg/build64/libvpx/lib
目录下会编译出 vpx的静态库 libvpx.a
。
FFmpeg 工程依赖的外部静态库都已经编译出来,下面可以开始编译 FFmpeg 工程了。
FFmpeg项目编译:
下载 ffmpeg 4.2 源码,链接:https://pan.baidu.com/s/1VpUvpLhew-nuq4Dns80mOw 提取码:g3k8
把文件 FFmpeg-4.2.zip
解压到 /home/loken/ffmpeg/ffmpeg
cd /home/loken/ffmpeg/ffmpeg-4.2
./configure \
--prefix=/home/loken/ffmpeg/build64/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/build64/libfdk-aac/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build64/libfdk-aac/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build64/libvpx/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build64/libvpx/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build64/libx264/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build64/libx264/lib" \
--extra-cflags="-I/home/loken/ffmpeg/build64/libmp3lame/include" \
--extra-ldflags="-L/home/loken/ffmpeg/build64/libmp3lame/lib"
make -j8
make install
编译完成之后,build64/ffmpeg-4.2 目录如下:
可以看到 ffmpeg.exe 已经编译出来了。这个时候 在MSYS2 仿真linux命令行里,ffmpeg.exe 是可以运行的。如图。
但是如果在window CMD 命令行运行 ffmpeg.exe ,会报错,提示 The application was unable to start correctly (0xc000007b)
。
0xc000007b 这个错误是因为 64位 exe 文件引用了 32位的库。
0xc000007b 这个错误比较麻烦,因为你看不到他缺少哪些库,实际上这个 0xc000007b 就是build64/ffmpeg-4.2/bin 目录缺少 libwinpthread-1.dll,所以 启动 ffmpeg.exe 的时候去了其他目录找了个 32位 的 libwinpthread-1.dll 进行引入。
实际上,要在CMD环境运行 ffmpeg.exe ,还需拷贝6个dll库到 build64/ffmpeg-4.2/bin
- C:\msys64\mingw64\bin\libwinpthread-1.dll
- C:\msys64\mingw64\bin\SDL2.dll
- C:\msys64\mingw64\bin\zlib1.dll
- C:\msys64\mingw64\bin\liblzma-5.dll
- C:\msys64\mingw64\bin\libbz2-1.dll
- C:\msys64\mingw64\bin\libiconv-2.dll
把上面这6个 dll全部拷贝到 build64/ffmpeg-4.2/bin ,再运行 ffmpeg.exe 就不会报错了
重要知识点:
- 如何查看exe ,dll 的是 32位 还是 64位 ? 解答:dumpbin.exe /headers ffmpeg.exe
MSYS2 环境下 ffmpeg 64位的编译已经讲完了,下面介绍QT 如何调用 FFmpeg 的 api 函数。
之前编译ffmpeg 的时候,configure 指定了 --enable-shared,所以项目生成了几个DLL动态库。
- avcodec-58.dll 编解码API。
- avdevice-58.dll 设备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,创建工程 "ffmpeg-qt-version-64"。
2,勾选 64 位编译环境 kit 。
3,把 \home\loken\ffmpeg\build64
整个目录拷贝到 ffmpeg-qt-version-64 项目目录下。
4,修改 ffmpeg-qt-version-64.pro
文件:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.c
contains(QT_ARCH, i386) {
message("32-bit")
} else {
message("64-bit")
INCLUDEPATH += $$PWD/build64/ffmepg-4.2/include
LIBS += $$PWD/build64/ffmepg-4.2/bin/avformat.lib \
$$PWD/build64/ffmepg-4.2/bin/avcodec.lib \
$$PWD/build64/ffmepg-4.2/bin/avdevice.lib \
$$PWD/build64/ffmepg-4.2/bin/avfilter.lib \
$$PWD/build64/ffmepg-4.2/bin/avutil.lib \
$$PWD/build64/ffmepg-4.2/bin/postproc.lib \
$$PWD/build64/ffmepg-4.2/bin/swresample.lib \
$$PWD/build64/ffmepg-4.2/bin/swscale.lib
}
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-64
项目。会提示 0xc000007b 错误。这个错误也是因为缺少库,导致它程序自动去其他目录找了个32位的dll进行引入。
7,把 build64/ffmpeg-4.2/bin/*.dll 所有DLL都复制到 build-ffmpeg-qt-version-64-Desktop_xxxx-Debug\debug
目录。然后再次编译运行 ffmpeg-qt-version
项目,就会正常打印出 version。
注意事项:
- 项目文件路径不要有中文,QT 可能会报错。
常见错误:
- 如果报错找不到文件之类的,把qt 的
build-ffmpeg-qt-version-Desktop_xxx-Debug
目录删掉,因为可能有缓存,再重新执行上面步奏。
版权所属:知识星球:弦外之音,QQ:2338195090。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。