ffmpeg编译总结

来源:互联网 发布:eclipse优化运行速度 编辑:程序博客网 时间:2024/06/07 06:16
1. ffmpeg-0.6.3.tar.bz2  http://ffmpeg.org/releases/ffmpeg-0.6.3.tar.bz2
2. SDL-1.2.15.tar.gz       http://www.libsdl.org/download-1.2.php
3. mingw-msys-0.6-x86.zip http://sourceforge.net/projects/mingwbundle/files/
4. yasm-1.2.0-win64.exe http://yasm.tortall.net/Download.html
5. 安装mingw-msys,WIN7管理员身份运行,默认路径C:\MinGW和C:\msys,桌面产生快捷方式MinGW-MSYS
6. yasm-1.2.0-win64.exe 改为 yasm.exe,复制到C:\MinGW\bin下
7. WIN7管理员身份运行MinGW-MSYS
8. 安装SDL,
./configure --prefix=C:/MinGW && make && make install 
9. 安装ffmpeg,安装到C:\msys\1.0\local下
./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解决办法

1、找到include目录中的ffmpeg\common.h
2、在“#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要进行强制转换

0 0
原创粉丝点击