本文來自: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打包,就可以發佈了