windows下编译ffmpeg工程
步骤:
1、搭建 MinGW 的编译环境
下载yasm,地址:http://yasm.tortall.net/Download.html
改名为yasm.exe放到C:\WINDOWS\system32 或者 C:\MinGW\msys\1.0\bin文件夹下。
下载 mingw-get-inst-20101030.exe , 点击这里下载 http://sourceforge.net/projects/mingw/files/ 。
安装时选择如下
安装过程中,需要联网。安装程序会去网上下载对应的程序。这一过程耗时较长,请耐心等候。
注意:如果安装过程中,网络断开或是无法出现了下载某些组建失败,不用担心,等安装程序运行完成后,再次运行安装程序,选择如上,安装程序会继续下载没有成功的软件。
打开C:\MinGW\msys\1.0\msys.bat文件,在文件头部加上
这句话的作用就是: 设置 2008 x86 的开发环境。我们主要是使用它的 lib.exe 生成 *.lib 文件。
运行msys.bat, 程序会根据你当前的用户名,在目录(C:\MinGW\msys\1.0\home)下建一个工作目录。
目录的名称和你的用户名一样。如果当前你的系统用户名是 administer, 那么你的工作目录就是(C:\MinGW\msys\1.0\home\administer)
2、编译 FFmpeg
解压缩 ffmpeg代码 到 MinGW 的工作目录。例如(C:\MinGW\msys\1.0\home\administer)
运行 C:\MinGW\msys\1.0\msys.bat,即可进入 MinGW 的工作目录了。
他和cmd命令有区别,右斜杠需要换成左斜杠,盘符D:也要改成/d
输入命令 "ls" , 这等价于 "dir"。列出当前目录下的文件。
输入 cd ffmpeg,进入ffmpeg 目录。
在命令行下输入如下命令:
成功后,编译生成的文件保存在 (C:\MinGW\msys\1.0\local\bin),头文件保存在 (C:\MinGW\msys\1.0\local\include)。
./configure --disable-debug --enable-static --enable-memalign-hack --enable-swscale --disable-avformat --disable-avfilter --enable-pthreads --enable-runtime-cpudetect --disable-w32threads --disable-ffprobe --enable-version3 --disable-everything --enable-decoder=h264 --enable-decoder=mpeg4 --disable-ffmpeg --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegvideo
3、在VC中使用FFmpeg静态库
Additional Dependencies
libavcodec.a libavformat.a libavutil.a libswscale.a libz.a libdts.a libfaac.a libfaad.a
libgsm.a libmp3lame.a libnut.a libogg.a libtheora.a libvorbis.a libvorbisenc.a libx264.a
libxvidcore.a libpthreadGC2.a libgcc.a libmingwex.a wsock32.lib vfw32.lib
要使用ffmpeg的静态库,必须把ffmpeg用到的其他静态库也链接到VC的工程中。这些库主要包括
libgcc.a:gcc的函数库,一般在C:\MinGW\lib\gcc\mingw32\4.x.x\
libmingwex.a:_snprint函数所在,一般在C:\MinGW\lib\
libcoldname.a:_strcasecmp的实现,也在C:\MinGW\lib\
wsock32.lib:Windows socket库
libz.a:zip压缩库
libfaad、libx264等额外编解码库
静态库的链接顺序一定不能错,否则运行时会出现一些莫名其妙的问题。建议的链接顺序是
libgcc.a libmingwex.a libcoldname.a libavcodec.a libavformat.a
libavutil.a libswscale.a libz.a libdts.a libfaac.a libfaad.a libgsm.a
libmp3lame.a libnut.a libogg.a libtheora.a libvorbis.a libvorbisenc.a
libx264.a libxvidcore.a libpthreadGC2.a wsock32.lib vfw32.lib
编译ffmpeg
有两个编译方式,一个是静态库,一个是动态库。
首先启动msys,
c:/msys/1.0/msys.bat
在shell上的提示符如下:
Administrator@LIGO-PC ~$首先进入ffmpeg目录,编译一般是三个步骤,首先配置,然后编译,最后安装。如果是改变编译方式,则还要在配置之前先clean
3.1 编译静态库
A. 配置
在shell提示符下输入:
./configure --enable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"
这个过程要花费较长的时间,开始会有较长的时间没有反应。其中的prefix是msys的安装路径
B. 编译
make
C. 安装
make install
安装只是把要开发使用的库文件拷贝到c:/msys/1.0/lib/目录中,头文件拷贝到c:/msys/1.0/include/目录中。
产生的库文件为.a文件
3.2 编译动态库
动态库和静态库只在配置上的差别,配置如下:
./configure --enable-shared --disable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"
后面的步骤一样:
make
make install
在开始编译之前,可以把原来编译的目标 文件清除掉:
make distclean
动态编译应该是会产生lib文件,但是我编译之后一直没有产生,所以后面的开发,用的都是静态库
编译之后的dll文件被放到了ffmpeg目录下,可以搜索查看它们
4. 开发
基于ffmpeg的开发,本来是想着比较简单,但实际上还是有点问题
起初在vc6.0下编译,一直编译不过,只好放到vs2008下编译,才编译通过,但是在release下还是没办法编译通过,链接时的错误如下:
1>libmingwex.a(mbrtowc.o) : error LNK2019: unresolved external symbol __imp____lc_codepage referenced in function _mbrlen1>libmingwex.a(wcrtomb.o) : error LNK2001: unresolved external symbol __imp____lc_codepage1>../binRelease/chipdecoder.dll : fatal error LNK1120: 1 unresolved externals
包含的头文件和库文件如下:
#ifdef __cplusplusextern "C" {#endif
#include "libavformat/avformat.h"
#pragma comment(lib, "libgcc.a")#pragma comment(lib, "libavcodec.a")#pragma comment(lib, "libavformat.a")#pragma comment(lib, "libavutil.a")#pragma comment(lib, "libmingwex.a")#ifdef __cplusplus}#endif其中的libgcc.a和libmingwex.a是从c:/msys下拷贝过来的,编译之前,要把c:/msys/1.0/include和c:/msys/1.0/lib两个目录加入到编译工程中
另外,由于我是先在vc6.0下编译的,无法编译通过,所以就对这些头文件进行了部分修改:
A. 把c:/msys/1.0下的三个文件_mingw.h、inttypes.h、stdint.h拷贝到了include目录中
B. 在_mingw.h文件的结尾处(在#endif /* __MINGW_H */一行之前)添加了一行:
#define __restrict__
C. 把所有long long改成了__int64,如果是直接在vs2008下编译,则这个修改应该是不需要的
D. 在stdafx.h文件的
#include <windows.h>
之后,添加:
#include <math.h>
注意,这一行必需在包含avformat.h之前,否则总是在math.h中编译通不过