转载 从linux转到vs的问题(制作FFmpeg SDK for MS Visual Studio)

来源:互联网 发布:淘宝助理打印 编辑:程序博客网 时间:2024/04/30 19:41

制作FFmpeg SDK for MS Visual Studio

作者:金海建

编译SDK

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

 

建立工程:

我们用ffplay验证我们的SDK,如果发现SDK问题,就可以得到及时的解决。建立一个ffplay的空工程,把ffplay.c,cmdutils.c,cmdutils.h,config.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.h到libavutil中。修改#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安装的头文件不全,从libavcodec中copy这两个头文件

 

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中没有usleep,usleep是微妙级别的,所以需要把代码改为

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。我们把include、lib和ffmpeg编译出来的dll打包,就可以发布了。
0 0
原创粉丝点击