window10_ffmpeg调试环境搭建-自己移植

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。


《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 里面,因为 ffmpeg.c 里面用了linux api函数,所以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,如下图。

相关阅读:


版权所属:弦外之音。 由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loken2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值