本文章在于学习和讨论,有不足希望各位访客指出,我们相互讨论学习。
这几天公司需要解码库,然后就让我去学习ffmpeg,在网上看了很多资料,然后自己就试着编译一下ffmpeg库,过程艰辛呀!
刚开始不熟悉,就找了一个在Linux下的编译教程,然后自己就装了一个ubuntu的虚拟机,在ubuntu下试着编译,结果是浪费了太多的时间,我的ubuntu是10.4上面很多库都没有,到最后编译出来拿到windows下不能用,最后自己就放弃了,又在网上找了一个windows的编译版本,这下就好了,下面就是我的编译过程。
编译环境:windows 64位,VS2008
1.编译这个现有几个准备动作,首先去下载一个MINGW,在http://sourceforge.net搜索mingw,然后下载安装mingw安装的时候把C, C++ , msys都选上,然后等待安装,安装会有一段时间,主要是要下一些东西,安装路径最好在磁盘的根目录下.我的安装路径:D:\MinGW,然后在D:\MinGW\msys\1.0就能找到msys.bat,。
2.用记事本(或则UEdit)打开msys.bat,在前面最前面加入一行: call"D:\work\VS2008\VC\bin\vcvars32.bat" 这其实就是加入VS2008的lib工具vcvars32.bat,所以前面这个路径就是自己机器上的vcvars32.bat路径,加入了这一行,ffmpeg就会编译出windows下DLL相对应的LIB,这样就不用在自己去导出LIB。
3.去官网下载一个ffmpeg最新的版本,不过我是用的一个版本管理工具SVN,SVN本来是在Linux下的,不过在windows下面也有一个叫TortoiseSVN。通过百度搜索找到这个TortoiseSVN,然后下载安装,完成以后就会发现邮件菜单多了两个SVN相关的选项,这时候你就可以找一个地方来存放将要通过TortoiseSVN下载下来的ffmpeg源码了,比如我在f盘新建一个文件夹fmpeg,然后进入这个文件夹,右键->SVN checkout ,然后在URL of repository一栏输入“svn://svn.mplayerhq.hu/ffmpeg/trunk” 然后点击输入框右边的我想文件打开的那个按钮等待一段时间你就会看见ffmpeg的以小额东西,然后点ok,等待一段时间就下载好了,这时候你就得到了最新的ffmpeg版本,关于SVN的一些东西这里就不详细说了,有兴趣在自己去了解。然后ffmpeg编译用到了一些汇编指令,这时你可以去下载一个yasm.exe,没有这个也行只是编译出来的东西不支持汇编,速度可能会有一点影响
4.以管理员身份运行vcvars32.bat(如果是win7的话)然后进入到刚才下好的ffmpeg源码目录,注意这里的进入目录方法和windows的有区别,比如进入F:\ffmpeg windows下是: D:
然后cd ffmpeg 但是这里是cd /f/ffmpeg。这是Linux下的文件路径方式,习惯就好。进入目录以后就输入./configure --enable-shared --disable-static --enable-memalign-hack然后等待较长的时间(中间有可能会出现一些函数不支持的错误,比我我在编译的时候有一个strcasecmp这个函数的的就不支持,我就一个一个进文件离去把它改成strcmp好麻烦的,让我头疼,不过功夫不负有心人,最后成功了),界面回到$开头后输入make等在一段时间(其实在这一步已经把我们需要的DLL和LIB都生存好了在他们相应的文件下,如果你觉得你nb你就可以不用接下来这一步了),界面回到$开头后输入make install等待一段时间这时候就会在D:\MinGW\msys\1.0\local下面得到编译好的全部东西(这一步其实就是整理上一部编译好的东西和一些头文件)。
这里就算完成了,如果还想加入或则开启一些ffmpeg的功能可以在第一步之前先./configure --help查看相应的一些功能说明。
最后说一下我用这个库时的悲痛,编译出来一直用不起,就是始终在链接这些函数的时候找不到这些函数,之前我一直以为是我的编译没有配对,结果到最后千辛万苦才找出来我的错误,我是在C++里面用这个库,结果FFmepg是一个纯c语言的,所以就没法识别,以前每台注意,主要是有些库它在写的时候考虑了C++的兼容的,而ffmpeg没有,解决办法就是把要用的ffmpeg头文件全部包含在extern "c"{ };里面这样就解决了这个问题。
总结一下这个过程,我大概花了一周左右,本来可以早点解决的,到最后编译出来用不起有还以是不是编译的问题,结果是一个很小的基础知识问题,真是因小失大,看来基础很重要,还有一点就是通过这次的独立学习,我对查资料,如何了解上手一些东西有了更好的一个认识,这也是我自己成长的一个过程吧!给自己加油!~