window10_ffmpeg调试环境搭建-编译64位 - 弦外之音

/ 0评 / 0

前面已经介绍了 如何用 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

  1. C:\msys64\mingw64\bin\libwinpthread-1.dll
  2. C:\msys64\mingw64\bin\SDL2.dll
  3. C:\msys64\mingw64\bin\zlib1.dll
  4. C:\msys64\mingw64\bin\liblzma-5.dll
  5. C:\msys64\mingw64\bin\libbz2-1.dll
  6. C:\msys64\mingw64\bin\libiconv-2.dll

把上面这6个 dll全部拷贝到 build64/ffmpeg-4.2/bin ,再运行 ffmpeg.exe 就不会报错了

重要知识点:


MSYS2 环境下 ffmpeg 64位的编译已经讲完了,下面介绍QT 如何调用 FFmpeg 的 api 函数。

之前编译ffmpeg 的时候,configure 指定了 --enable-shared,所以项目生成了几个DLL动态库。

下面介绍 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。

注意事项:

常见错误:


版权所属:知识星球:弦外之音,QQ:2338195090。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注