《window10_ffmpeg调试环境搭建-自己编译》已经讲解了 window10 如何用 MSYS2 + MinGW 编译出ffmpeg 的DLL动态库,然后如何使用 qt 调用 DLL动态库的函数打印ffmpeg 的版本号。
本文主要讲解,如何移植 ffmpeg 工程到 Qt creator环境进行断点调试,因为如果要理清楚ffmpeg的转码,滤镜等实现,断点调试可以事半功倍。
ffmpeg源代码 有3个工程 ,ffmpeg,ffplay,ffprobe,这3个工程都是调用DLL动态库里面的函数实现的。
下面就展示一下如何 把 ffmpeg 这个转码工程移植到qt进行调试。也就是第一篇文章那个 ffmpeg-qt 项目我是如何搞出来。
编译出ffmpeg.exe运行程序,需要以下文件:
- config.h
- cmdutils.h
- ffmpeg.h
- cmdutils.c
- ffmpeg.c
- ffmpeg_cuvid.c
- ffmpeg_filter.c
- ffmpeg_hw.c
- ffmpeg_opt.c
以上文件都在 FFmpeg-4.2\fftools
目录下。
最主要的文件是 ffmpeg.c ,这个是入口问题,所有的转码逻辑都在ffmpeg.c 里面,本教程是针对 qt creator MinGW 的,请不要使用 MSVC。
移植开始:
1,打开Qt creator,点击New File Or Project,选择 Non-Qt Project ,选择 Plain C Application。创建一个 ffmpeg-qt-yizhi 工程。
2,选择 MinGW 32 bit 编译环境。
3,把 第二篇文章编译的C:\msys64\home\loken\ffmpeg\build32
整个目录拷贝到 ffmpeg-qt-yizhi 项目目录下。
4,下载SDL 的编译文件,我已经准备好了,下载链接:百度网盘,提取码:60fw 。下载完后把文件解压到 ffmpeg-qt-yizhi 项目目录下。
5,回到第二篇文章我们在MSYS2编译的ffmpeg源码路径,C:\msys64\home\loken\ffmpeg\ffmpeg-4.2
,把 FFmpeg-4.2\fftools
目录下的所有 *.c 文件都拷贝到 ffmpeg-qt-yizhi 项目目录下。
6,把我们之前在MSYS2 环境编译出来的 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\config.h
头文件拿出来,拷贝到ffmpeg-qt-yizhi 项目目录下。
因为 config.h 是程序自动生成的,config.h 有些配置是根据 MSYS2环境定制生成的,所以现在拷贝到window10 qt creator的编译环境,config.h 里面有些配置选项需要手动改下,后面会讲如何改。
7,虽然只有8个 *.c文件,但是为了让 ffmpeg.c
能在qt creator里面跑起来,需要移植很多头文件。开始拷贝头文件。
8,拷贝头文件小技巧,window搜索框输入 *.h 就可以匹配到某个目录下以 h 结尾的文件。
9,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\compat\va_copy.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\compat\va_copy.h
10,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavcodec\x86\*.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavcodec\x86\
11,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavcodec\*.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavcodec\
12,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\network.h
到ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\
13,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\os_support.h
到ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\
14,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\url.h
到ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\
15,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavresample\avresample.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavresample\
16,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavresample\version.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavresample\
17,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavutil\x86\*.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavutil\x86\
18,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavutil\*.h
到 ffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavutil\
19,拷贝完毕。开始修改 ffmpeg-qt-yizhi 项目目录下的 config.h,之前说过,这个文件是程序自动生成的,环境不同,里面的配置也要相应改变。
#define HAVE_GETPROCESSMEMORYINFO 1 改成 #define HAVE_GETPROCESSMEMORYINFO 0
#define HAVE_PTHREAD_CANCEL 0 改成 #define HAVE_PTHREAD_CANCEL 1
#define HAVE_PTHREADS 0 改成 #define HAVE_PTHREADS 1
#define HAVE_W32THREADS 1 改成 #define HAVE_W32THREADS 0
20,修改 ffmpeg-qt-yizhi.pro
文件:
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
HEADERS += \
cmdutils.h \
ffmpeg.h \
config.h
SOURCES += cmdutils.c \
ffmpeg.c \
ffmpeg_opt.c \
ffmpeg_filter.c \
ffmpeg_hw.c \
ffmpeg_cuvid.c
contains(QT_ARCH, i386) {
message("32-bit")
INCLUDEPATH += $$PWD/build32/ffmepg-4.2/include
INCLUDEPATH += $$PWD/SDL2/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 \
$$PWD/SDL2/lib/x86/SDL2.lib
} else {
message("64-bit")
}
21,运行项目。
22,会提示缺少 DLL,按照之前的教程,把缺的dll都拷贝到 build_xxx/debug 目录。dll都在 ffmpeg-qt-yizhi 项目里,之前已经拷贝过去了的。
23,拷贝完缺少的DLL后,再次运行项目。
登登登,ffmpeg.c 断点调试成功了。
重要知识点:
- window 系统搜索框可以 输入 "*.h" 搜出目录下的全部 .h 后缀的文件,非常方便。
- ffmpeg根据不同平台定义了很多头文件,我们只用到x86,如下图。
相关阅读:
- ffmpeg 官方编译文档:https://ffmpeg.org/platform.html
- ffmpeg 官方编译文档,https://trac.ffmpeg.org/wiki/CompilationGuide
版权所属:知识星球:弦外之音,QQ:2338195090。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。