参考链接: C mbrlen()
由于工作原因,需要使用ffmpeg在windows下进行代码跟踪
于是,上网找相关文章,搜索出来有很多,经过查看,其中的一个英文网站是最好的,网址:
http://ffmpeg.arrozcru.org/wiki/index.php?title=Main_Page
上面有详细说明整个过程,但为了防止此网站不能访问的问题,这里特把一般步骤写下来,以做个记录。后面会说明我在按照上面说的步骤进行的过程中遇到困难的解决方法。
说明:
A. 在后面叙述的过程中,可能需要有支持7z压缩格式的解压缩软件,最新的winrar应该就是支持的
B. 以下的步骤,只是真对ffmpeg编译,所以涉及到无关的部分,本文不会关心它们,除非有特别说明
1. 下载ffmpeg源代码,下载网址:svn://svn.mplayerhq.hu/ffmpeg/trunk
首先需要安装svn客户端,我用的是TortoiseSVN,应该是可以很方便地从网上下载,下载之后安装。
安装之后,在你要保存ffmpeg源代码的位置上点右键,然后选择check out,输入以上的网址,包括前面的“svn:”,然后点OK按钮,它会把整个源代码下到本地,根据网速,可能几秒钟到几十分钟不等。源代码30M左右
2. 安装windows下的编译系统
2.1 安装MSys
首先下载以下软件:
MSYS-1.0.11-2004.04.30-1.exe MSYS-1.0.11-20080821-dll.tar.gz bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 make-3.81-MSYS-1.0.11-2.tar.bz2
安装MSYS-1.0.11-2004.04.30-1.exe 的最后会出现一个dos窗口,大意是让用户选择是否让msys自己提交install,输入n后回车,以表示我们不允许msys自己进行这个操作。
为了方便后面的叙述,我们假设msys安装到了默认的目录c:/msys/1.0下
解压MSYS-1.0.11-20080821-dll.tar.gz 到c:/msys/1.0下,覆盖原目录
解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 后,从解压出的目录中,bin下拷贝sh.exe到c:/msys/1.0/bin下,如果原来存在,则覆盖之,这个解压后的目录可以删除
解压 coreutils,然后拷贝解压出来的 coreutils-5.97/bin/pr.exe 到c:/msys/1.0/bin中
解码make-3.81-MSYS-1.0.11-2.tar.bz2 到c:/msys/1.0下,如果有文件存在,则覆盖它们
为了产生正确的库文件,需要修改c:/msys/1.0/msys.bat:
使用记事本打开该文件,然后在其最开始处添加:
call "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat"
注意:这一行必需处在此文件的最开始处(我把它放到除去rem开头之外的最前面还是不能正常工作,不知道为啥),同时修改你的vc路径,我的是vs2008,所以是9.0,此修改指定vc的vcvars32.bat文件位置并招待它
如果是你的os是64位的,还需要对该文件的 _WindowsNT 处进行修改,紧跟这一行的下面一行添加:
rem Hopefully a temporary workaround for getting MSYS shell to run on x64
rem (WoW64 cmd prompt sets PROCESSOR_ARCHITECTURE to x86)
if not "x%PROCESSOR_ARCHITECTURE%" == "xAMD64" goto _NotX64
set COMSPEC=%WINDIR%/SysWOW64/cmd.exe
%COMSPEC% /c %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
goto EOF
:_NotX64
关于64位的部分,我没有试,只不过是直接从说明处到拷贝过来
2.2 安装MinGW
下载以下6个安装包:
· binutils-2.18.50-20080109-2.tar.gz
· mingwrt-3.15.1-mingw32-dll.tar.gz
· mingwrt-3.15.1-mingw32-dev.tar.gz
· w32api-3.13-mingw32-dev.tar.gz
gcc-core-3.4.5-20060117-1.tar.gz gcc-g -3.4.5-20060117-1.tar.gz
下载后解压以上6个到c:/msys/1.0/mingw中,如果有重复的,则覆盖掉
另外gcc编译器也可以选择4.2.1版本的:
gcc-core-4.2.1-sjlj-2.tar.gz gcc-g -4.2.1-sjlj-2.tar.gz
但在解压之后,需要进行改名:
c -sjlj.exe to c .exe cpp-sjlj.exe to cpp.exe g -sjlj.exe to g .exe gcc-sjlj.exe to gcc.exe 我用的是3.4.5的,所以我的不需要改名
2.3 整合MinGW 和 msys系统
这一步非常简单,修改c:/msys/1.0/etc/fstab.sample的名称为:fstab,即把括展名直接去掉,然后用记事本打开,修改
c:/mingw /mingw
为
c:/msys/1.0/mingw /mingw
然后保存即可。
修改的内容应该是自己的安装路径
到此,所有的系统已全部完成。在该网站上,还有说明上面安装的软件包的版本问题,这部分不再翻译,直接拷贝到如下:
Get the most up-to-date MSys MinGW system.
Today (November 29, 2008), that includes:
· make
The version of make that is installed by default will not work for FFmpeg. You will have to upgrade. make must be MSYS make version => 3.81 Preferably version 3.81-2. Also do not get MinGW make. Get MSYS make.
· Mingw runtime
Must be version => 3.15 Note: if any older version is used, everything will still build and link fine, but non numeric AVOptions will not work in ffmpeg (-flags, etc.)
· w32api
Should be version => 3.13 Note: if any older version is used, you will have to --disable-devices while configuring FFmpeg, and vfwcap will not be compiled in.
· bash
Must be version => 2.05b to build FFmpeg. Preferably version 3.1 to build most other external libraries.
· binutils
do not use binutils-2.15.91-20040904-1. It is known to not link properly. (2.17 recommended by Gianluigi Tiesi)
3. 编译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 _mbrlen 1>libmingwex.a(wcrtomb.o) : error LNK2001: unresolved external symbol __imp____lc_codepage 1>../binRelease/chipdecoder.dll : fatal error LNK1120: 1 unresolved externals
包含的头文件和库文件如下:
#ifdef __cplusplus extern "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中编译通不过
先暂时写到这里,没有写得更详细,以后有时间再补充