前言
最近在学习一些视频编解码相关的知识,发现大家都推荐FFmpeg库。FFmpeg库有个牛逼的ffmpeg命令,这个命令是通过ffmpeg.c文件编译出来的。正好最近代码没思路,必须要通过单步调试ffmpeg.c,借鉴一下优秀思想。
学习新的代码库都是从编译开始的,但是很多博客都说编译ffmpeg是一个比较复杂的过程,尤其是在windows上那就更加麻烦。本文为了更直接的达到调试ffmpeg.c的目的,采用开源社区的FFmpeg发布版本。
下载FFmpeg
登录到FFmpeg官网,进入到下载页面下载ffmpeg-4.4.1.tar.bz2。
解压ffmpeg-4.4.1.tar.bz2源代码得到目录:
本文我们主要关注ffmpeg.c文件的调试,ffmpeg.c文件在fftools目录:
下载FFmpeg-Builds-Win32
首先在github上面找到一个FFmpeg-Builds-Win32的项目
FFmpeg-Builds-Win32,进入到下载页面下载ffmpeg-n4.4.1-2-gcc33e73618-win32-gpl-shared-4.4.zip
为什么要找FFmpeg-Builds-Win32这个项目,直接去FFmpeg官网下载编译好的程序的不香么。
原因是FFmpeg官网给的都是64位编译器编译出来的代码,而为了减少麻烦,直接用Qt自带的32编译器来调试FFmpeg才是最简单实用的办法。
下载完毕解压得到ffmpeg-n4.4.1-2-gcc33e73618-win32-gpl-shared-4.4目录:
下载并安装Qt
本文使用开源Qt版本,由于个人使用的是5.10.1版本,但是该没有在官网找到该版本。
如果有需求,可以在Qt官网下载新版本的离线安装包:5.12.x Offline Installers
点击下载完成的Qt离线安装包,开始安装。
欢迎页面
设置Qt账户
此处如果没有Qt账户,需要注册一个Qt账户,然后才能继续安装。
设置安装路径
选择安装组件
接受许可协议
开始菜单快捷方式
执行安装
安装完成
创建Qt工程
打开Qt,在文件菜单中,选择新建文件或项目,弹出New File or Project对话框,操作过程如下图:
右下角选择Choose继续下一步。
弹出新的Project Location对话框,填写名称和创建路径,右下角选择下一步继续:
Define Build System默认选择qmake,继续下一步:
Kit Selection选择Desktop Qt 5.10.1 MinGW 32Bit,继续下一步:
Project Management啥都不用选择,直接点击完成:
添加代码
在新创建出来的工程中,找到main.c文件,彻底删除:
从FFmpeg源代码的fftools目录拷贝如下文件到ffpmeg-debuger工程目录:
Qt工程添加现有文件到工程:
添加现有文件对话框中选中必要的文件:
添加文件之后,Qt工程如下:
拷贝FFmpeg-Builds-Win32解压目录下的include和lib目录到ffmpeg-debugger工程目录:
修改ffmpeg-debugger.pro为如下内容:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
cmdutils.c \
ffmpeg.c \
ffmpeg_filter.c \
ffmpeg_hw.c \
ffmpeg_opt.c
INCLUDEPATH += $$PWD/include
LIBS += $$PWD/lib/avcodec.lib \
$$PWD/lib/avdevice.lib \
$$PWD/lib/avfilter.lib \
$$PWD/lib/avformat.lib \
$$PWD/lib/avutil.lib \
$$PWD/lib/postproc.lib \
$$PWD/lib/swresample.lib \
$$PWD/lib/swscale.lib
编译ffmpeg.c
点击左下角的构建项目按钮,开始执行ffmpeg.c的构建:
解决编译ffmpeg.c的问题
尝试编译ffmpeg.c的过程中,不断发现有缺失的文件,最终汇总缺失的文件列表如下:
//ffmpeg-debugger的include目录缺失的文件
include\libavcodec\mathops.h
include\libavformat\os_support.h
include\libavutil\internal.h
include\libavutil\libm.h
include\libavutil\reverse.h
include\libavutil\thread.h
include\libavutil\timer.h
include\libavutil\wchar_filename.h
//ffmpeg-debugger的根目录缺失的文件
compat/va_copy.h
这些文件为什么缺失,目前还没研究那么深,暂且不清楚。
个人的解决办法是之前在windows10的WSL子系统编译过一次FFmpeg库,直接从WSL子系统中把缺失的头文件拷贝到ffmpeg-debugger工程的对应目录。
如果有需要,也可以直接在此下载:Qt调试ffmpeg.c时缺失的一些头文件汇总
将缺失的头文件拷贝到指定目录,继续尝试编译ffmpeg.c,发现有若干处需要注释代码的地方。
cmdutils.c第37行注释掉
cmdutils.c第60行注释掉
cmdutils.c第1074到1077行注释掉
cmdutils.c第1101到1128行注释掉
ffmpeg.c第76行注释掉
ffmpeg.c第90行注释掉
ffmpeg.c第95行注释掉
ffmpeg.c第97行注释掉
ffmpeg.c第422到440行注释掉
ffmpeg.c第3791到3796行注释掉
ffmpeg.c第4915到4921行注释掉
ffmpeg.c第332到333行注释掉
ffmpeg.c第4940到4942行注释掉
ffmpeg.c第164行注释掉
ffmpeg_filter.c第29行注释掉
ffmpeg.c第461到476行注释掉
修改完成后,再次编译,没有错误信息:
调试ffmpeg.c
ffmpeg.c编译完成得到ffmpeg-debuger.exe,这是一个命令行程序,必须设置命令行参数才可以正确启动。
设置ffmpeg.c调试命令行参数如下:
本文使用Qt调试ffmpeg.c时,命令行参数如下:
-i D:\ffmpeg\ffmpeg-debug\jindou.mp4 -c:v libx264 -c:a copy -f mpegts D:\ffmpeg\ffmpeg-debug\jindou.ts -y
其中,
D:\ffmpeg\ffmpeg-debug\jindou.mp4
:输入视频文件本地路径
D:\ffmpeg\ffmpeg-debug\jindou.ts
:输出视频文件本地路径
设置完成启动参数后,点击调试按钮调试ffmpeg.c,在调换环境中,可以查看当前打开文件列表、当前调用栈、当前堆栈参数、当前断点位置、所有断点列表等信息。
对于习惯使用visual studio和visual studio code的人,这个界面相信也很亲切。
后记
本文给出了一种在windows10系统中使用Qt调试ffmpeg.c的一种可行的思路,可能还有很多坑没有踩到,后续如果使用过程中遇到问题再改进。