ffmpeg的源码调试
因本人主要在windows环境下开发,Linux下的gpb调试工具又不如vs调试方便(使用过其他调试工具才知道,vs果真为宇宙最强调试工具),所以决定在windows编译可以调试FFmpeg,以方便调试和学习FFmpeg内部代码。
有过在visual studio下编程的小伙伴应该都知道vs的调试信息主要依靠于pdb文件,那么我们今天编译的目的就是使FFmpeg的动态库生成相应的pdb文件。
1、首先要声明一下环境,windows7 64位+visual studio 2010 + MinGW,其他系统无碍,如果不是visual studio 2010环境的小伙伴可以略过这篇文章了。如果环境正确,接下来的步骤小伙伴们可要一步一步盯住了哦。
2、环境搭建
(1)下载文件
FFmpeg源码下载这里就不多说了,自己去下载哈
以下文件请按照具体情况下载(电脑64位的请下64位的)
C99-to-C89 Converter & Wrapper(https://github.com/libav/c99-to-c89/releases)(如果无法下载请点这里)
Msinttypes(http://code.google.com/p/msinttypes/downloads/list)(如果无法下载请点这里)
MinGW,包含MSYS(http://sourceforge.net/projects/mingw/)(如果无法下载请点这里)
YASM(http://yasm.tortall.net/Download.html)(请下与系统环境对应的yasm-1.3.0,不是vsyasm,最近有些童鞋下载成vsyasm了如果无法下载请点这里)
(2)安装MinGW
下载好MinGW之后可以直接双击打开,按照默认的方式安装(建议默认安装,安装目录为C:\MinGW),此期间可能要下载一些文件,不同人因为网络的不同可能安装的时长也不相同。安装好之后返回桌面,双击快捷方式,打开界面如下(我的插件都已经安装好了,所以有绿色的部分):
如果你是第一次安装,请在和我同名的选项下右击,然后点Mark for Installation,全部选完之后点菜单栏的Installation->Apply Change,静静的等着下载吧。。。
(如果许久不能下载,你可以点这里,64位的哦)
安装好之后,如果上一步骤中MinGW安装的目录为C:/MinGW,则找到D:/MinGW/msys/1.0/msys.bat文件,右击编辑文件,在最前面加上一句话为(如果你下载的是我提供给你的MinGW,你一定要确认一下,路径是否正确):
call” C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat”
(C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat 这个路径为你自己的vs2010安装目录,如果是默认的安装目录你就按照上边的路径去找这个文件,每个人酌情而定,自己斟酌)
加好之后的效果如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(3)配置C99
配置好这个环境之后我们需要配置一下c99wrap环境(因为vs2010只支持到c89,不支持c99,所以这里要安装c99),将C99-to-C89压缩包里面的c99conv.exe、c99wrap.exe、makedef着三个文件复制到C:\MinGW\msys\1.0\bin(如果你下载的是我提供给你的压缩包,此步骤不用做,以防万一你要确认一下哦),配好之后的效果如下:
配置好c99后你不要动,在这个目录下(C:\MinGW\msys\1.0\bin)找到一个名为link.exe的文件,将他重命名一下(随便换个名字),目的是让他与vc的link.exe不冲突
配置好link之后,我们要配置一下yasm环境,将下载好的yasm-1.3.0.exe改名为yasm.exe,放入系统的运行目录下,此时你一定要注意32位和64位要对应,32位对应目录为C:\Windows\System32,64位对应目录为C:\Windows\SysWOW64,配置好的效果如下(本人的为64位系统):
- 1
- 2
- 3
- 4
这里你要注意了,这是环境配置的最后一步,也是最重要的一步,千万不要忘了将MinGW的bin目录加入到环境变量当中,具体操作为 我的电脑->右击->属性->高级设置->环境变量->Path 在末尾添加一项(如果此时末尾没有英文的分号,请记得添加之前加上英文的分号);添加的两个环境变量值分别为C:\MinGW\msys\1.0\bin和C:\MinGW\bin,添加好的效果如下:
- 1
- 2
(4)配置ffmpeg所需头文件
不要急着退出,此时你还需要新建一个名为INCLUDE的系统环境变量,变量值随意指向一个文件夹,这个文件夹下要装我们所下载的Msinttypes压缩包内的两个头文件,我的目录为D:\FFmpeg\include;
配置好之后的效果如下:
到这里,环境就算配置好了,你所需要做的就是重启电脑,不用担心重启好环境会崩溃哦,重启完之后我们将进入编译阶段哦
- 1
- 2
3、编译
重启完电脑之后你需要找到Visual Studio x64 兼容工具命令提示(2010)这个工具,具体位置如图所示:
以管理员打开,进入你的MinGW安装目录,运行msys.bat,运行之后会弹出MinGW32工具,运行效果如图所示:
- 1
- 2
打开MinGW之后,我们需要进入FFmpeg源码根目录,使用命令./configure -h获取编译命令
如果有小伙伴对编译命令(./configure -h)命令不熟悉的,可以参考这篇文章:
编译FFmpeg是configure文件帮助选项详解
http://blog.csdn.net/u010380485/article/details/54089918
如果你要生成pdb文件,命令 --toolchain=msvc是必不可少的
注意,你在configure之前一定要记得修改根目录下的configure文件,让它支持c99,修改后的效果如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
我使用的命令为
--enable-shared --enable-gpl --enable-version3 --toolchain=msvc --prefix="D:\FFmpeg\bin\FFmpeg3.2.2"
configure之后我们就可以使用命令 make 开始编译了,由于我已经编译过了,我这里直接给大家展示结果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
使用vs调试效果如下图所示
- 1
- 2
4、注意事项
(1)因vs2010不识别c99语法,而ffmpeg内用了c99语法,我们需要配置c99的环境,与此同时,我们也需要让编译知道ffmpeg使用了c99语法,所以我们configure之前必须修改ffmpeg源码根目录的configure文件,否则你在编译FFmpeg的过程中会出现语法错误的现象,修改方法上边已附图。
(2)我编译过很多版本的FFmpeg,但是唯一在编译FFmpeg3.x版本出现了莫名其妙的错误,如果你也遇到了同样的问题,那么请注意这里,尝试把FFmpeg依赖的头文件stdint.h删除,可能是其与vs的相冲突而导致,删除后即可编译通过。
(3)如果你在修改别人的代码或者是需要libavresample.lib或.h这个文件,在configure之前记得一定要加上 –enable-avresample,否则将不会生成这个文件
(4)在使用编译命令的时候请大家不要在configure的时候加上–enable-debug,如果加上会导致无法vs进入ffmpeg内部调试,谨记。
(5)如果编译好的库在引用的过程中出现
error C3861: ‘UINT64_C’: identifier not found
在common.h里加入定义如下:#ifndef INT64_C#define INT64_C(c) (c ## LL)#define UINT64_C(c) (c ## ULL)#endif(因在编写文章的时候加入回车键导致格式出问题,请添加的时候加入回车键)
(6)如果在编译中出现这个错误
错误 1 error C1189: #error : missing-D__STDC_CONSTANT_MACROS / #define__STDC_CONSTANT_MACROS
可以直接修改宏定义为#define __STDC_CONSTANT_MACROS
ffmpeg的源码调试的更多相关文章
- FFmpeg libswscale源码分析1-API介绍
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/14349382.html libswscale 是 FFmpeg 中完成图像尺寸缩放和像素 ...
- 开启Tomcat 源码调试
开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
- SpringMVC DispatcherServlet 启动和加载过程(源码调试)
在阅读本文前,最好先阅读以下内容(当然,如果对 Servlet 已经有所了解,则可跳过): http://www.cnblogs.com/cyhbyw/p/8682078.html http://ww ...
- 《k8s-1.13版本源码分析》-源码调试
源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...
- SpringBoot自动配置源码调试
之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...
- HashMap源码调试——认识"put"操作
前言:通常大家都知道HashMap的底层数据结构为数组加链表的形式,但其put操作具体是怎样执行的呢,本文通过调试HashMap的源码来阐述这一问题. 注:jdk版本:jdk1.7.0_51 1.pu ...
- .net源码调试 http://referencesource.microsoft.com/
其实关于.net源码调试 网上的资料已经很多了,我以前转载的文章有 VS2010下如何调试Framework源代码(即FCL) 和 如何使你的应用程序调试进.NET Framework 4.5源代码内 ...
随机推荐
- shell 一些例子
#!/bin/bash #Filename: password.sh by:-V love cmx stty -echo #这里表示 开启隐藏在终端的输出 read -p "Enter y ...
- Shell脚本之三 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推-- 实例 向脚本传递三个参数,并分 ...
- 使用rxjs以及javascript解决前端的防抖和节流
JavaScript实现方式: 防抖 触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间:思路:每次触发事件时都取消之前的延时调用方法: 举个例子:做一个自动查 ...
- SWIG 3 中文手册——2. 引言
目录 2 引言 2.1 SWIG 是什么? 2.2 为什么使用 SWIG? 2.3 一个 SWIG 示例 2.3.1 SWIG 接口文件 2.3.2 swig 命令 2.3.3 构建 Perl5 模块 ...
- PHP生成正则表达式的类
正则表达式,写起来还是比较费劲的,于是封装个类,初稿,抛砖引玉. 关于正则,建议参考 https://github.com/CyC2018/CS-Notes/blob/master/notes/%E6 ...
- 如何在Typora中使用流程图
1.横向流程图源码格式: graph LR A[方形] -->B(圆角) B --> C{条件a} C -->|a=1| D[结果1] C -->|a=2| E[结果2] A- ...
- Shell获取指定区间随机未占用的端口号
说明 最近在写Jenkins自动运维的脚本,由于是用的docker,部署的时候启动容器端口号冲突会导致部署失败,用的微服务也不在乎端口什么的,只求部署成功,所以想了很久,参考了一些文章,还有运维大哥的 ...
- ML学习笔记之XGBoost实现对鸢尾花数据集分类预测
import xgboost as xgb import numpy as np import pandas as pd from sklearn.model_selection import tra ...
- Static and Instance Methods in JavaScript
class.method/instance method https://abdulapopoola.com/2013/03/30/static-and-instance-methods-in-jav ...
- 2年java,蚂蚁一面,卒
其实我一个都没答上来.并不是因为我笨,是因为我不会.在大扰的帮助下,现在我会了,求求你再给我一个机会. TreeSet/HashSet 区别 顾名思义,首先是结构上的不同 1.TreeSet背后的结构 ...