在windows平台编译FFMPEG的静态链接库

这篇日志记录了我编译ffmpeg和x264的经历
包括我遇到的问题,想到的方法,解决的思路和办法
我的环境是windows平台下,使用最新的代码
在vc2005下的工程中静态链接使用

这几天一直在琢磨H264的解码库
因为之前用的从ffmpeg提取出来的代码比较老
在某些情况下会crash
也是ffmpeg工程组论坛上找到了
hust_xcl 提取的解码代码(看id应该是校友呢)
我使用它解出来的图像马赛克现象非常严重
并且有比较多的内存泄露
权衡了半天
决定还是自己动手吧

目前开源的h264的解码大概都是在用ffmpeg
不止是h264, 包括各种视频的解码及转码
那些视频网站的后台可能都是跑着ffmpeg
他是个很强大的库
但是在windows平台的编译却很麻烦
先让我发会牢骚 不吐不快
首先,搜索到的国内的资料基本都是抄,转载
链接的网址都无效了
有些概念我认为是错误的
ffmpeg工程组论坛似乎只有admin一个人回帖
很多问题之后都不了了之
即使解决了也不贴出解决方案
而且一些问题的解决的方法
都是知其然不知其所以然
不分享 不深究
这种态度不行啊

FFmpeg on Windows Wiki有详细的安装过程
在windows上编译ffmpeg 需要mingw环境
版本要求很重要
照这个wiki的说明下载即可
gcc有两个版本可以选择 我选择的是4.2.1
wiki作者说3.4.5,使用sse,mmx优化的时候会崩溃
其实只要按他的步骤去做就很简单
基本上不会有问题

编译好后我们会在lib目录里看到几个后缀是.a的文件
而不是我们熟悉的.lib文件
之前论坛上大家讨论要生成lib文件
要在msys.bat前加上call “…/vcvars32.bat”
这个lib不是用来静态链接的
应该称为隐式链接
我想很多人都要失望了

其实我们就是需要这些.a文件
把他们当lib文件一样用 静态链接进来
需要注意的是需要同时link libgcc.a这个文件
在mingw下搜索

这个时候会出现类似这样的错误

错误 7 error LNK2001: unresolved external symbol ___strtod libavcodec.a
错误 8 error LNK2001: unresolved external symbol _snprintf libavcodec.a

我们还需要link进去这个库 libmingwex.a,同样在mingw下搜索
做完这个,可能还会有link error

错误 22 error LNK2019: unresolved external symbol __imp____lc_codepage referenced in function _mbrlen libmingwex.a
错误 23 error LNK2001: unresolved external symbol __imp____lc_codepage libmingwex.a

开始我考虑可能同样是还需要链接某个运行时库
在mingwrt-3.15.1-mingw32-dev.tar.gz里试了半天
发现link libmsvcrt.a 就可以顺利编译
正当我想得意,发现编译的程序在退出的时候必然崩溃
这个地方困了我一天 都不知道到底怎么回事
搜索了一下 到处也没有说需要libmsvcrt.a
尝试了半天,发现并不需要这个
把vc工程的运行时库设置为/MT或者/MTd即可

ffmpeg包含了很多的解码库和部分编码库
实际上我们并不完全需要
在编译运行./configure的时候
我们可以禁用所有的模块
再设置我们需要的
如使用默认的 光libavcodec.a就有十几m
我的选项类似如下

–enable-memalign-hack –disable-decoders –disable-encoders –disable-muxers –disable-demuxers –disable-parsers –disable-protocols –disable-bsfs –disable-devices –disable-filters –disable-network –disable-ipv6 –disable-mpegaudio-hp –disable-debug –enable-small –enable-decoder=h264

这样编译出来使用的大小还是会比提取出来的工程大900k左右
桌面环境,忍了

做到这一步
顺手就把libx264给编译了
相比之下 libx264简单多了
而且他还包含有msvc的工程
这两天的版本vc编译会有错误
其实是工程里的一个文件已经没了
在工程中删除掉就可以
在msys下编译更简单
甚至我们把libx264集成到ffmpeg里
不过不太明白ffmpeg的编码方法
尝试了一下 看了看example 放弃了

现在想想
在windows下编译ffmpeg并不是难事
只是这个尝试的过程太过痛苦
很多时候 我宁愿全部删除重新建立一个工程
也不愿在原来的基础上去修改
太麻烦

ffmpeg和libx264的最新源码都不需要svn或者git去得到
在主页都有daily tarball的下载

本想把遇到的问题,要注意的细节好好的记录下来
写到深夜,脑子也累了
以后想到再说吧
其实我对这些也不熟悉
赶鸭子上架研究了几天
欢迎指正和探讨

ffmpeg http://ffmpeg.mplayerhq.hu
libx264 http://www.videolan.org/developers/x264.html

你可能感兴趣的:(视频编解码)