ffmpeg編譯總結

 

1. ffmpeg-0.6.3.tar.bz2  http://ffmpeg.org/releases/ffmpeg-0.6.3.tar.bz2 php

2. SDL-1.2.15.tar.gz       http://www.libsdl.org/download-1.2.phphtml

3. mingw-msys-0.6-x86.zip http://sourceforge.net/projects/mingwbundle/files/web

4. yasm-1.2.0-win64.exe http://yasm.tortall.net/Download.htmlide

5. 安裝mingw-msys,WIN7管理員身份運行,默認路徑C:\MinGW和C:\msys,桌面產生快捷方式MinGW-MSYS函數

6. yasm-1.2.0-win64.exe 改成 yasm.exe,複製到C:\MinGW\bin下ui

7. WIN7管理員身份運行MinGW-MSYSspa

8. 安裝SDL,.net

./configure --prefix=C:/MinGW && make && make install 命令行

9. 安裝ffmpeg,安裝到C:\msys\1.0\local下code

./configure --enable-shared --disable-static --enable-memalign-hack && make && make install  

10. 把 C:\msys\1.0\local下 的lib,include拿來用便可

11. 若是不裝sdl,沒法編譯成功ffplay

12. 若是運行ffplay,記得把sdl.dll弄過來

13. 最後 make clean,或者直接delete

 

注意:

1. 以上是WIN7 64系統,若是是32,yasm換成 yasm-1.2.0-win32

2. ffmpeg若是是其餘版本,生成動態庫的引入庫的時候會有問題

編輯msys.bat, 加入call " C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"

隨便找一個VS版本,利用其中的lib.exe

3. 執行上步以前最好先運行一下C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\lib.exe,

若是提示缺乏dll,搜索之,而後複製過來,全部步驟結束後刪除,dll的大概位置在C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

4. 若是任仍然沒法生存引入庫lib,考慮手動,打開VS的命令行,運行相似如下的命令,注意路徑lib /out:c:\test\avcodec.lib /machine:IX86 /def:C:\test\avcodec-52.def

5. 若是仍是搞不定lib,那就用ffmpeg-0.6.3吧

使用ffmpeg可能遇到如下問題

1. error C3861: 'UINT64_C': identifier not found

#ifndef INT64_C
#define INT64_C
#define UINT64_C
#endif

2. Cannot open include file: 'inttypes.h': No such file or director解決辦法

一、找到include目錄中的ffmpeg\common.h
二、在「#define COMMON_H」以後加入以下代碼,同時刪除「#include <inttypes.h>」 而後保存:


#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
# define CONFIG_WIN32
#endif
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)
# define EMULATE_INTTYPES
#endif
#ifndef EMULATE_INTTYPES
# include <inttypes.h>
#else
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
# ifdef CONFIG_WIN32
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
# else
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
# endif
#endif

3. 出現Cannot open include file: 'stdint.h': No such file or directory

在出現 #include <stdint.h>的地方注掉便可

4. 出現 'class' : missing tag name

將void show_help_children(const AVClass *class, int flags);

改爲void show_help_children(const AVClass *avclass, int flags);

5. SHOW_MODE_NONE未定義

將enum ShowMode {
SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
}show;

改爲enum ShowMode {
SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
};而後放到VideoState外面去。

VideoState裏面的改爲 enum ShowMode show_mode;

6. 出現error C2668: 'sqrt' : ambiguous call to overloaded function

這涉及到C++的函數重載的概念。 好比當編譯器看到sqrt(3)的時候,它會試圖去找一個sqrt(int)的函數,可是找不到。 因而退而求其次,找一個能夠從int轉換過去的sqrt,有兩種狀況:sqrt(long double),sqrt(float)。編譯器認爲把int轉換成long double或者float都很合理。 解決辦法:(1)sqrt(3.0) (2)sqrtf(3)

將 double w = 1 / sqrt(nb_freq);

改爲double w = 1 / sqrt((double)nb_freq);

7. 出現 'usleep': identifier not found

這裏由於VC中沒有usleepusleep是微妙級別的,因此須要把代碼改成

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

to

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

8. 出現missing ')' before identifier 'PRId64'

在頭文件添加如此定義

#define INT64_C(val) val##i64
#define _64BITARG_ "I64"
#define PRId64 _64BITARG_"d"
#define PRIu64 _64BITARG_"u"

9. cannot convert from 'int' to 'PixelFormat'

將 vp->pix_fmt = is->out_video_filter->inputs[0]->format;

改爲vp->pix_fmt = (PixelFormat)is->out_video_filter->inputs[0]->format;

不能直接將Int賦值給PixelFormat要進行強制轉換

相關文章
相關標籤/搜索