制作FFmpeg SDK for MS Visual Studio

原创  制作FFmpeg SDK for MS Visual Studio 收藏

制作FFmpeg SDK for MS Visual Studio

作者:金海建

编译SDK

编译之后,运行make install后,在C:/MSYS/local会生成binincludelib等文件夹。这样ffmpeg的编译环境就帮我生成了一个SDK,这个SDKlinux上用C来开发是没有问题的,我们需要使这个SDKMS Visual Studio 开发环境中能用,编译的时候会碰到一大堆问题。我的环境是VS2008

 

建立工程:

我们用ffplay验证我们的SDK,如果发现SDK问题,就可以得到及时的解决。建立一个ffplay的空工程,把ffplay.ccmdutils.ccmdutils.hconfig.h导入这个空工程中,然后在VS2008中配置头文件目录和lib库目录(注意:ffplay需要用sdl,把sdl也加进入)

 

编译并排错

下面是在VS2008中,编译ffplay出现的错误,有些错误时ffplay中出现的,有些事sdk的问题。

fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory

vs2008下没有这个文件,实际上这个文件无非也就是一些整形定义而已,可以直接注释掉这个包含,自己创建这个文件,放到inclue/libavutil下,include改为#include "libavutil/inttypes.h"

 

fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory

copy C:/MSYS/include下的stdint.hlibavutil中。修改#include <stdint.h>#include “stdint.h”

 

fatal error C1083: 无法打开包括文件:“libavdevice/avdevice.h”: No such file or directory

用不着,直接注释

 

ffplay.cpp中报错

fatal error C1083: 无法打开包括文件:“libavcodec/audioconvert.h”: No such file or directory

fatal error C1083: 无法打开包括文件:“libavcodec/colorspace.h”: No such file or directory

make install安装的头文件不全,从libavcodeccopy这两个头文件

 

fatal error C1083: 无法打开包括文件:“unistd.h”: No such file or directory

许多在Linux下开发的C程序都需要头文件unistd.h,但VC中没有个头文件,

所以用VC编译总是报错。把下面的内容保存为unistd.h,可以解决这个问题。

 

/** This file is part of the Mingw32 package.

 *  unistd.h maps     (roughly) to io.h

 */

 

#ifndef _UNISTD_H

#define _UNISTD_H

 

#include <io.h>

#include <process.h>

 

#endif /* _UNISTD_H */

 

提示

static int wanted_stream[AVMEDIA_TYPE_NB]={

    [AVMEDIA_TYPE_AUDIO]=-1,

    [AVMEDIA_TYPE_VIDEO]=-1,

    [AVMEDIA_TYPE_SUBTITLE]=-1,

};语法错误

 

VC的标准C++不支持这个赋值方式,我们改为

static int wanted_stream[AVMEDIA_TYPE_NB]=

{

     -1,

     -1,

     0,

     -1,

     0

};

 

error C3861: “rint”: 找不到标识符

rint函数是个四舍五入的方法,我们自己实现

inline long rint(double x) 

if(x >= 0.)

 return (long)(x + 0.5); 
else 
return (long)(x - 0.5); 
}

 

指示FFTSample data[2][2*nb_freq];表达式错误

我们知道标准C++不支持动态数组。修改为

FFTSample *data[2];

data[1] = malloc(sizeof(FFTSample) * 2*nb_freq);

data[0] = malloc(sizeof(FFTSample) * 2*nb_freq);

最后释放

free(data[0]);

free(data[1]);

 

error C3861: “usleep”: 找不到标识符

VC中没有usleepusleep是微妙级别的,所以需要把代码改为

usleep(is->audio_st && is->show_audio ? rdftspeed*1000 : 5000);

to

Sleep (is->audio_st && is->show_audio ? rdftspeed*1 : 5);

 

指出    ap->time_base= (AVRational){1, 25};语法错误。

还是标准C++不支持这种语法,修改为

ap->time_base.num = 1;

ap->time_base.den = 25;

 

error C2054: “inline”之后应输入“(”

这是因为c不支持inline,我们把cmdutils.c改为cmdutils.cpp,把ffplay.c改为ffplay.cpp

 

链接错误:

现在编译可以通过,但是现实一大堆库没有链接(好像有77个链接错误),把

avcodec-52.lib

avformat-52.lib

avutil-50.lib

swscale-0.lib

加进去还是没用,发现是我们用了ffplay.cpp,需要在ffmpeg所有头文件中加。

#ifdef  __cplusplus

extern "C" {

#endif

 

#ifdef  __cplusplus

}

#endif

这样就可以正确链接了。

 

最后可以正确编译出ffplay.exe。我们把includelibffmpeg编译出来的dll打包,就可以发布了。

 

http://blog.csdn.net/jinhaijian/archive/2010/09/10/5875771.aspx

转自 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值