又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的。对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug。

sorry,废话多了。首先给个思路:

1.使opencv 的highgui project能Link到上文build出来的ffmpeg 文件(lib,dlls。。。)

2.然后尝试在MSVC下debug时,完成宏的修改,使其在vc下可用。

3.完成cap_ffmpeg.cpp 的修改,使其正确加载ffmpeg 的动态库,这样程序才可以debug到source。这一步,网上很少提到,只能自己开动脑筋了。

ok,进入正题:

1.LNK property 配置:

右键--》项目--》属性,在debug mode(当然你也可以是全模式下),进入VC++ Directories ,设置"你的ffmpeg的/bin路径" 到 Executable Directories,当然你最好也把这个路径放到计算机的PATH中,有时候vc找不到。如果还不行,就提出所有dll,扔到system下(注意要放对位置,system有2种)

进入C/C++,设置include 路径,ok。

然后进入其下面的Preprocessor下的Difintions中,加入

USE_FFMPEG
__STDC_CONSTANT_MACROS

(为什么加这个,其实就是为了让MSVC认识 gcc中一些特有的宏,这在上一篇文章中都有解释过编译核心的选择问题)

进入Linker--》General:设置Additional Libaray Directories ,为了让MSVC可以不被ffmpeg原生的gcc宏影响,这里要使用到MinGW的gcc库,同时要让opencv看到你的ffmpeg libs,dlls,所以加入:

C:\MinGW\lib\gcc\mingw32\4.8.1

F:\ffmpeg-dev\bin(这里就是libs和dlls)

进入Input,设置所有ffmpeg的libs,把他们在Additional Dependencies中一一列出。

注:这里如果你要配置static库用来debug的话,为了防止Image Safe的erro,可以关闭Linker下Advanced的"Image Has Safe Exception Handlers".

ok,至此。我们就完成了highgui的配置。

下面做第二步:

要从git上下载两个header files:(直接gg 第一个文件名就可以了)

inttypes.h

stdint.h(不要把它与vc下的混淆,这个文件的一些int类型定义是针对上面的文件的)

这里的2文件主要定义了ffmpeg的gcc形式的macro和basic data type。

然后扔到ffmpeg的include folder下。

ok,接着就开启 opencv的 ffmpeg impl接口,我们以前见过的opencv_ffmpegxxx.dll的函数原型都封装于此,具体你可以到dll中看看。

下面贴一下我对这个文件的modify:

#include "precomp.hpp"

#if defined HAVE_FFMPEG //&& !defined WIN32//修改
#include "cap_ffmpeg_impl.hpp"
#else
#include "cap_ffmpeg_api.hpp"
#endif

第二个更改:

icvInitFFMPEG()
{
#if 0//defined WIN32 || defined _WIN32//修改
# ifdef HAVE_WINRT
const wchar_t* module_name = L"opencv_ffmpeg"
CVAUX_STRW(CV_MAJOR_VERSION) CVAUX_STRW(CV_MINOR_VERSION) CVAUX_STRW(CV_SUBMINOR_VERSION)
#if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__)
L"_64"
#endif
L".dll";

icvFFOpenCV = LoadPackagedLibrary( module_name, 0 );

# else
const char* module_name = "opencv_ffmpeg"

CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

#if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__)
"_64"
#endif
".dll";

icvFFOpenCV = LoadLibrary( module_name );
# endif

ok,保存。

下面修改,cap_ffmpeg_impl.cpp,这就是opencv和ffmpeg的链接核心,

第一部分要修改的:

#include "cap_ffmpeg_api.hpp"
#include <assert.h>
#include <algorithm>
#include <limits>
///Ek
#if _MSC_VER//修改
#define snprintf _snprintf
#endif
///end

这个就是为了让MSVC躲避gcc语法的编译麻烦。

第二部分:

#ifdef __GNUC__
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#define __STDC_CONSTANT_MACROS ///ek修改
#ifdef __cplusplus
extern "C" {
#endif

到此,所有的修改都完成了,保存,F5.你就进入了一个神奇的ffmpeg世界。

Thanks from EK,enjoy it。

注:转载请注明,谢谢。

下一次,会找点时间,写一下ffmpeg的源码分析。。。。

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC),布布扣,bubuko.com

时间: 2024-12-15 07:14:26

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)的相关文章

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源码简单分析:libswscale的sws_scale()

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

Spring5源码深度分析(二)之理解@Conditional,@Import注解

代码地址:https://github.com/showkawa/spring-annotation/tree/master/src/main/java/com/brian 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象[email protected]注解快速注入第三方bean对象[email protected] 开启原理4.基于ImportBeanDefinitionRegistrar注册bean5.基于FactoryBean注册bean对象 1.使用@C

FFmpeg源码结构图 - 解码

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

Win 10 下Pipenv源码安装 odoo12

**Win 10 下Pipenv源码安装 odoo12** 因为,本身电脑已经安装odoo8,9,10等odoo的版本,当时,没有考虑是直接是统一的环境很配置. 现在,在odoo11的环境下,需要Python 3的语言环境可以很好地支持odoo11的功能,所以在网上查到了现在比较火的创建虚拟环境的安装工具 pipenv,用它可以很好地隔离各个项目环境,为每一个项目都提供单独的运行环境.安装步骤:一. 安装 Python 3.6.4,配置环境变量:地址:https://www.python.org

完整版linux下android源码下载、编译、模拟器启动运行

一.环境说明: 1.VMware版本:8.0.3 build-703057 2.liunx系统:Ubuntu10.10 3.jdk:sun-java6-jdk 二.Ubuntu 10.10更新源列表 由于??Ubuntu 10.10版本的源已经过期了,所以,需要对其进行更新,Ubuntu 10.10 已经发布了,下面提供更新源方法与更新源列表地址: 1.sudo gedit /etc/apt/sources.list     编辑你的源列表,将原来的内容全部删除,添加下面的源,复制到你的列表中,

如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)

1 前言 这是SpringBoot2.1源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境.如果有经验的小伙伴们可以略过此篇文章. 2 环境安装要求 IntelliJ IDEA JDK1.8 Maven3.5以上 3 从github上将SpringBoot源码项目下载下来 首先提供SpringBoot2.1.0的github地址: https://github.com/spring-projects/spring-boot/tree/v2.1.0.RELEASE 因为要进行阅读源码

Android源码开发利器——Java源码调试(基于4.1.2)

原文地址:http://blog.csdn.net/jinzhuojun/article/details/8868038 调试Android Java源码 草帽的后花园--Neo 写在之前的话:这里主要是以调试Java源码为主,应该说是在system_process之后的源码,这对于调试和修改frameworks层的人来说真是一个利器,但至于为什么在system_process之后,我还在分析,如果有结果我会更新此文章,并正在尝试调试C++的代码,就是native中的代码,如果这个可行那将会大大

最新版ffmpeg源码分析

最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合到输出文件中,当然输出文件也可