window10_ffmpeg调试环境搭建-自己移植 - 弦外之音

/ 0评 / 0

《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运行程序,需要以下文件:

以上文件都在 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.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\compat\va_copy.h

10,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavcodec\x86\*.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavcodec\x86\

11,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavcodec\*.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavcodec\

12,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\network.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\

13,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\os_support.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\

14,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavformat\url.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavformat\

15,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavresample\avresample.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavresample\

16,拷贝C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavresample\version.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavresample\

17,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavutil\x86\*.hffmpeg-qt-yizhi\build32\ffmepg-4.2\include\libavutil\x86\

18,拷贝 C:\msys64\home\loken\ffmpeg\ffmpeg-4.2\libavutil\*.hffmpeg-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 断点调试成功了。

重要知识点:

相关阅读:


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

发表回复

您的电子邮箱地址不会被公开。