FFmpeg在Windows下使用VisualStudio调试

FFmpeg是音视频开发者的入门和必备工具,其通过一套完整的接协议、解封装、解码、渲染(或播放)、编码、封装,将大量的媒体协议、封装协议、codec、filter等集成到一起。

对于许多开发者来说,想要友好的调试FFmpeg似乎是一件不太容易的事情。FFmpeg虽然支持大部分编译环境,但是大部分Windows用户使用FFmpeg时的编译、调试环境并不那么友好。不折腾一番,想要在VisualStudio上成功调试起FFmpeg,似乎不太容易。

我从17年开始第一次接触FFmpeg,到现在(2020年7月),经历过几种不同的调试FFmpeg的方式:

1、在Linux上编译FFmpeg,通过log输出的方式进行调试。对初级开发者来说,最痛苦的就是log调试了吧。后来学习了GDB,知道FFmpeg在configure的时候可以通过选项关闭优化,打开调试,使用GDB进行调试,算是初步使用工具开始了FFmpeg的调试之路。

2、在Mac上进行FFmpeg编译,用XCode或VSCode进行调试。这在Mac上的体验很好,利用IDE进行调试的感觉,大家都懂。但是Mac的用户量太少。

3、在Windwos上使用msys2(mingw)进行编译,用VisualGDB+VisualStudio进行调试。这种方式可以很好的解决在VisualStudio上进行FFmpeg调试的问题。但是VisualGDB工具不是免费的

4、在Windows上使用msys2(VC)进行编译,直接用VisualStudio进行调试。

 

下面是具体的做法(小白用户不用担心,我会把教程写的详细详细再详细。希望即使最小白的用户都可以最终搞定FFmpeg在Windows下用VisualStudio来进行调试。为了保证教程的准确性,我开了一台新的阿里云服务器,在上面重复下面我所写的内容)另外,考虑到大部分资源都需要在国外网站上下载,我把这篇博客需要的资源都放在了百度网盘中,大家可以自己下载:

链接:https://pan.baidu.com/s/1WS9jk9OZA4GaxlOKbdNyew 
提取码:0arc

过程大致分为以下几个阶段(按照小白用户从0开始准备的。如果您对某些阶段已经很熟悉了,直接跳到您需要的环节即可)

1、获取FFmpeg源代码; 2、搭建msys2环境; 3、为FFmpeg执行VisualStudio编译的configure; 4、编译FFmpeg; 5、配置VisualStudio工程开启调试。

 

0、先介绍下我的环境:

Windows2019 数据中心64位中文版、msys2、VisualStudio2019。这只是我的环境,操作系统不重要;VisualStuio的版本不用非得跟我一样。ffmpeg的configure脚本中说vs2013及以后的版本都是ok的(大致意思是说:从VS2013(cl编译器大版本号为18)开始,其完整支持C99特性来编译FFmpeg)

FFmpeg在Windows下使用VisualStudio调试_第1张图片

1、如何获取FFmpeg源代码?

FFmpeg源代码可以从其官网https://ffmpeg.org/ 或从github https://github.com/FFmpeg/FFmpeg上获取。

需要说明的是:

(1)由于众所周知的原因,从国内访问这两个网站都比较慢,大家可以尝试,速度可以明显提升很多

(2)完整的FFmpeg git库比较大,为了研究使用,可以直接下载最新的某个release版本即可,如下图所示:

首先打开github地址,点击tags

FFmpeg在Windows下使用VisualStudio调试_第2张图片

然后直接点击这些链接下载相应的压缩包:

FFmpeg在Windows下使用VisualStudio调试_第3张图片

到我写这篇博客的时候,最新的release版本是4.3.1,我下载的zip压缩包,文件大小为16.8MB。

将其解压,放到某个地方,为了方便起见,我放到c盘根目录下

 

2、搭建msys2环境

什么是msys2?简单点说,就是在windows上创建一个仿linux命令行的环境,使得你可以在其中执行各种脚本命令。msys2集成了mingw编译环境。mingw是gcc windows的实现版本。(gcc是一群大牛写的一套编译器,基本上在各个平台都有实现)

获取msys2:https://www.msys2.org/  通常情况下,国内用户访问这个网站会很慢,并且下载速度也很慢,可以直接从我的百度网盘中下载

然后安装,直接一路下一步就可以了。(默认安装位置是c:/msys2,这个位置可以选择自己改一下)

打开msys2 64bit环境

FFmpeg在Windows下使用VisualStudio调试_第4张图片

而后安装autoconf和automake工具,在msys2中运行:pacman -S autoconf automake make

注:网上其他教程说还需要安装gcc等其他工具。由于我们后面要用vc的编译器,所以不需要再下载gcc了

FFmpeg在Windows下使用VisualStudio调试_第5张图片

由于网速的原因,又是一个漫长的等待过程。。。。

 

3、为FFmpeg执行VisualStudio编译的configure由于要在msys2中使用VS的编译器,所以要先开启VC的命令行环境。

(1)windows的文件后缀名有可能被隐藏掉,所以需要关闭隐藏后缀名,如下操作:

(a)点击夹中的 查看->选项

FFmpeg在Windows下使用VisualStudio调试_第6张图片

(b)点击查看,取消勾选“隐藏已知文件类型的扩展名”

FFmpeg在Windows下使用VisualStudio调试_第7张图片

(2)在msys2安装目录下创建一个文件,命名为msys_vs2019.bat(后缀名为bat,保证其可以被执行),内容如下:(其中第二行call....是VS的安装路径)

set MSYS2_PATH_TYPE=inherit

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"

msys2_shell.cmd -mingw64

(3)将C:\msys2\usr\bin\link.exe改一下名,因为会和vc的link.exe重名。

(4)双击msys_vs2019.bat运行,脚本将再次打开msys2环境

(5)定位到ffmpeg的目录,如果ffmpeg在c盘根目录下,需要输入: cd /c/FFmpeg-n4.3.1/

(6)执行./configure --prefix=./buildout/ --toolchain=msvc --disable-optimizations --disable-x86asm

说明: --prefix后面的路径是ffmpeg编译后执行的安装目录; toolchain是选择的编译工具  --disable-optimizations选项是禁止优化,方便后续调试;--disable-x86asm是禁止汇编优化,因为我们没有装相关工具

FFmpeg在Windows下使用VisualStudio调试_第8张图片

经过一个漫长的confugre过程后,如果出现以下内容,代表配置成功:

FFmpeg在Windows下使用VisualStudio调试_第9张图片

ffmpeg的configure过程,其实是执行一个脚本,去检查ffmpeg中集成的各个模块,需要的编译环境是否存在。如果存在,就将其集成进来,反之就不集成。最后会将配置的结果告诉给你。比如上图最后写的Enable indevs,就是说经过配置检查后,开启的输入设备有dshow、lavfi、gdigrab、vfwcap;再将msys窗口向上翻一翻,找到如下图所示内容:

FFmpeg在Windows下使用VisualStudio调试_第10张图片

会看到允许开启的硬件加速包括d3d11va,dxva;允许编译的library包括avcodec、avformat等;编译生成的程序包括ffmpeg、ffprobe;允许的解码器包括aac、escape130等。。。

(7)configure的过程在ffbuild目录下的config.log文件中。configure的结果被记录在config.mak文件中

 

4、编译FFmpeg

直接执行 make -j4即可:(-j4代表同时开启4个线程编译。这个看个人电脑配置,比如你的电脑最多支持8核16线程,那也可以写 make -j16,开启16个线程编译)

FFmpeg在Windows下使用VisualStudio调试_第11张图片

然后又是漫长的编译过程。。。。如果你闲着无聊,可以打开任务管理器,看看cpu疯狂工作的场景

编译过程中有三处提示错误:

(a)文件ffprobe.c,做出如下修改:

FFmpeg在Windows下使用VisualStudio调试_第12张图片

(b)文件cmdutils.c,做出如下修改:

将PRINT_LIB_INFO宏的生命注释掉,添加一个空的声明

将print_program_info的函数体都注释掉

以上两部分都是打印信息,不影响运行流程,由于时间的原因,暂时没研究编译错误的原因

FFmpeg在Windows下使用VisualStudio调试_第13张图片

修改后再次编译,可以编译成功:

FFmpeg在Windows下使用VisualStudio调试_第14张图片

其中ffmpeg_g.exe和ffprobe_g.exe是带有调试符号的版本。但是实际上VC编译器的调试符号在pdb文件中,所以这两个文件与不带_g后缀的文件大小一样:

FFmpeg在Windows下使用VisualStudio调试_第15张图片

 

5、配置VisualStudio工程,调试ffmpeg

(1)创建一个新的空工程,设置工程属性如下:

FFmpeg在Windows下使用VisualStudio调试_第16张图片

其中命令参数-i C:\testinput.mp4 -y c:\output.mp4代表将c盘下的testinput.mp4文件转换为c盘下的output.mp4文件,所以你需要自己准备一个testinput.mp4文件放到c盘根目录下

(2)将fftools/ffmpeg.c文件添加到本工程中,在main函数里面添加断点:

FFmpeg在Windows下使用VisualStudio调试_第17张图片

(3)点击F5运行调试,会提示编译出错,是否在上次编译成功结果上继续运行,选择“是”。然后就可以在断点处断下。

剩下的过程,大家自己去享受吧。

 

 

以上教程可能会有一些纰漏,如果大家有问题,可以给我发邮件交流讨论。

[email protected]

你可能感兴趣的:(FFmpeg在Windows下使用VisualStudio调试)