製作FFmpeg SDK for MS Visual Studio

本文來自:http://blog.csdn.net/jinhaijian/archive/2010/09/10/5875771.aspx

 

編譯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打包,就可以發佈了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章