我自己的FFMpeg编译之路
为了编译这个东西,快折腾了一个星期了。期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹。
在这一个星期里前前后后加起来总共使用了3中方式编译ffmpeg
1. 在基于linux内核的操作系统中编译。这种方式很简单,也很顺利。
2. 在windows下, 采用cygwin编译,这种方法稍微复杂一点。
3. 在windows下,采用MinGW + MSys编译,这种方法是这三个方法中最为复杂的一种。涉及的东西也最多,花费的时间也最长。
下面就这个三种方法详细介绍一二。
我所选用ffmpeg source code 的版本是0.6,可以以下连接获取。
http://www.ffmpeg.org/releases/ffmpeg-0.6.tar.gz
基于linux内核的操作系统中编译:
我所用的操作系统是ubuntu, 将下载ffmpeg的源码放在/home目录下面。或者你也可以用svn从服务器上checkout ffmpeg的代码。ubuntu默认情况下是没有安装svn,但是你可以通过一个非常的简单的命令就完成安装,命令是sudo apt-get subversion。前提是你可以访问因特网。这个过程大约需要几分钟,具体的时间跟你的网络状况有关系。
打开终端,进入ffmpeg目录。依次输入以下命令:
./configure --enable-memalign-hack --disable-debug
make
你也可以将2条命令合成一条,一次性执行完成。
./configure --enable-memalign-hack --disable-debug && make
当命令完成之后你就可以在ffmpeg的目录下找到8个可执行程序:
ffmpeg.exe
ffmpeg_g.exe
ffprobe.exe
ffprobe_g.exe
ffplay.exe
ffplay_g.exe
ffserver.exe
ffserver_g.exe
每个可执行程序有一个_g的相对应。这个带调试信息的可执行程序。
这样编译任务完成。
似乎很顺利, 接下来我们轻松一下,用我们编译出来的成果来看个电影,敲入如下命令:
./ffplay /media/downdriver/hly.mp4
然而我们被告知:
Could not initialize SDL library: No avaiable video device
这是怎么回事呢? 原来我的系统中没有安装x11的库文件, 因此编译出来的SDL库就没有加载视频设备的能力了。那接下来我们首先下载对应x11的库文件,然后重新编译SDL, 那么有没有必要重新编译ffmpeg呢, 没有必要。
下载库文件:
sudo apt-get install libx11-dev
下载必要的头文件:
sudo apt-get install xorg-dev
安装成功后,再次进入sdl源代码目录重新编译, 不要忘了首先执行:
make clean
接着是:
./configure
make && make install
再来一次:
./ffplay /media/downdriver/hly.mp4
呵呵,成功了,看到我们的视频了...
通过windows + Cygwin编译:
首先安装Cygwin, 通过以下连接获取:
http://www.cygwin.com/setup.exe
这种方式的安装过程,最复杂,和最耗时的就在安装Cygwin上了。setup.exe下载非常简单也很快,都不到1M. 但是这只是下载了安装的包的客户端。接下来的安装是通过setup.exe从官方网站下载安装包。速度会很慢,并且根据你所选的包种类,大小不一样。如果全部选中那么你将要下载的总大小在六七百M以上。也许你觉得不大,但是当我告诉你速度下载的速度很慢时,并且经常会出现下载到半截就死活不动了。(至少在中国很慢,不光是我有这种感受,在网上看到很多人都有这个问题,甚至有位网友为了解决这个网速慢和下载不动的情况,自己研究一套方案)。并且如果全选安装后会吃掉你两三个G的空间。我们只是编译ffmpeg,所以没有必要全选,只选devel这个就可以了(忘了说怎么进行安装,由于安装向导做的不错,所以你只要按照向导说的一步一步往下走ok ,我这里只说其中关键的步骤)。另外在选mirror site的时候请选ftp://mirrors.kernel.org(如果你在中国这个网站可能会快一些)。为了下载我试过里面几乎所有的网站,当然如果你选用我推荐的这个网站,速度仍然很慢,你可以选用美国的那些镜像。也许你会问我怎么知道那个是美国的镜像,问得好,打开www.cygwin.com这个网站,这是cygwin的官方网站。在主页的右面请点击mirror site,那么现在你可以看到那些是美国的了。
好了,让我们继续。
假设你现在已经安装完成了cygwin的安装。打开cygwin的命令窗口, 进入ffmpeg 的目录,cygwin进入windows的方式为
cd /cygdrvie/[盘符]/...
例如进入d:\test\ffmpage,那么命令就是:
cd /cygdrive/d/test/ffmpeg
进入目录后,键入 ./configure --enable-memalign-hack --disable-debug 然后回车
等待几分钟后,看到执行成功,祝贺你。接下来我们要执行的命令是make.
但是当你输入make后发现,提示你make不认识。好,去 cygwin的bin目录看看有没有这个make.exe存在, 结果不存在,那我们去找个一个最新的make.
这里有2个方法来解决这个问题,
1. 重新启动cygwin的setup, 在安装组件选择界面中, 在最上方的文本框中输入make, 下面就会相应的显示包,然后选择安装这个包,继续完 成安装.
2. 在网络上找一个最新的make, 要求版本是3.81. 然后直接拷贝到 /cygwin/bin目录.
好,现在再一次执行命令make, 你会看到CC xxx, CC xxx之类的东西.说明已经用gcc开始编译了.
如果没有什么编译错误, 你可以在命令行的最后几行看到ffmpeg.exe, ffserver.exe, ffprobe.exe
这说明成功了.
但是你会发现你没有看到ffplay.exe
那是因为要编译ffplay必须依赖于sdl库,这同样是一个opensource 的东西, 对应的官网是http://www.libsdl.org. 这个库负责一些输入设备的事件以及界面的事情. 若想了解更多,请参看官网.
接下来我们要做的是下载对应的源代码,编译,安装.
首先下载源代码:
http://www.libsdl.org/release/SDL-1.2.14.tar.gz
下载完毕后拷贝到 /cygwin/home/下面.然后cygwin的窗口中进入home目录, 接着输入tar -szvf sdl-1.2.14.tar.gz 这个命令是用来解压我们刚才下载的文件的. 解压完毕后, cd sdl-1.2.14进入sdl的源代码目录. 执行sh autogen.sh, 大约一分钟后, 你会看到 you are ready to run confingure. 这个表示刚才那条命令执行成功了. 并且告诉你下一条命令是configure. 好接下来我们输入./configure命令.
这个需要几分钟的时间. 我在执行这条命令时出错,
***Your compiler (gcc) does not produce Win32 executables
google了一下, 找到一个解决办法:
是在一个老外的网站看到的, 他是这样写的
$ chmod 755 /usr/bin/set-gcc-default-3.sh $ /usr/bin/set-gcc-default-3.sh
但是当输入第一条命令后, 错了, 说找不到set-gcc-default-3.sh. 我们去对应目录找找, 果然没有. 并且usr目录下竟然没有bin这个目录. 我猜是不是在/cygwin/bin下面, 果然在那里找到了. 从这个可以看到开源代码一个很大的问题, 版本很稳定. 变化很大. 也许我的这个编译文档过几个月可能就不能用了.好了回到主题.
当编译完毕后需要将gcc的版本切换回来, 切换回4的命令如下:
$ chmod 755 /usr/bin/set-gcc-default-4.sh $ /usr/bin/set-gcc-default-4.sh
这个命令是的作用是将gcc的版本转换为3, 当前版本是4. 因为sdl要求的环境是3的.
接下来就是
make
make install
如果上面的命令执行都没有错误的话, 接下来我们要做的就是重来编译我们的ffmpeg, 就是进入ffmpeg的目录,执行
./configure --enable-memalign-hack --disable-debug
make
这里有个小技巧, 可以帮助我们在不执行make命令的情况下, 判断执行make命令后我们能不能得到ffplay. 毕竟make需要超过10分钟的时间. 就是在configure命令执行完毕后查看结果的最初20行左右, 找到sdl support, 如果它的右边写的是yes, 那就说明我们可以得到ffplay,如果是no, 那就得不到ffplay.
我的结果是yes, 接下来执行make, 还是有错误, __assert 没有定义之类的错误.有人说把对应的libavformat等文件下 .a文件删除.然后用
./configure --enable-memalign-hack --disable-debug --enable-shared --disable-static
如果要编译出ffserver,还需要加上--enable-network --enable-protocols --enable-muxers
到这里在cygwin下面的编译就通过了.
顺便解释一下,如果你要编译出动态库,就要加上
--enable-shared
--enable-static
另外, --enable-memalign-hack是指编译时,使用内存对齐方式,这样以便编译时用mmx或者sse指令对代码进行优化。
make install
在这种编译方式下是把编译出来的文件拷贝到C:\cygwin\usr\local\bin目录,要看你的cygwin安装到什么地方,我的安装在c盘,所以是C:\cygwin\。如果是后面的一种编译方式,则是将编译出来的文件拷贝到msys的安装目录,如我的是安装到c盘,就是c:\msys\local\bin
ffmpeg编译时,还可以根据你cpu 核心的个数,进行编译时间的优化,也就是说当你指定你的cpu为双核时,比你不指定编译要快。例如指定2核心时:
make -j2
通过windows + MinGW + MSYS编译
这种编译方式最为复杂, 也是花去我时间最多的一种.
首先去MinGW的官网下载安装包.
官网是 www.mingw.org
安装包的连接:
如果不可用去
http://sourceforge.net/projects/mingw/
下载.
MSYS的下载地址:
http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe
接下来就是安装mingw和msys.安装顺序一定要是先安装mingw再安装msys.因为在安装msys的过程中要你指定mingw的安装目录.
mingw的安装没有什么可说的, 就是采用默认安装, 不要更改它的默认目录, c:/mingw. 接下来安装msys.
msys安装过程中会问你是否已经安装了mingw, 敲入y然后回车
接着让你输入mingw的安装目录, 输入c:/mingw, 注意是反斜扛.
这样我们环境似乎准备好了(之所以这么说, 是因为我们在后面编译的过程中会发现很多问题). 那么开始我们的编译之旅吧.
在开始菜单中依次找到mingw->msys->msys.打开shell环境.
同样需要进入ffmpeg目录. 有些人直接把ffmpeg拷贝到mingw的home目录, 这样进入ffmpeg目录很简单. 只要在打开shell窗口后,输入cd ffmpeg-0.6(这里ffmpeg-0.6是我放置ffmpeg的目录). 就可以编译了. 我是放在D盘. 因为本人不喜欢在系统盘下放太多的东西. 为了进入本人的ffmpeg目录需要这样:
cd /d
cd downloadcode
cd ffmpeg-0.6
这里 /d 代表进入d盘, 接着downloadcode文件夹, 再进入ffmpeg-0.6
从这里可以看出在cygwin的shell下面和msys的shell下面还是有点不一样.
好了, 我们执行
./configure --enable-memalign-hack --disable-debug
没有出错
接着输入
make
告诉我make不认识, 看来遇到的是和windows+cygwin下面同样的问题, 用同样的方法解决.
成功的执行完make后, 回到我们的ffmpeg文件下面看看, 编译出来哪些东西.
发现只有ffprobe.exe ffmpeg.exe
没有ffplay.exe, ffserver.exe
google后发现, 有个老外碰到同样的问题, 并给出了解决办法. 从sdl的官网下载已经编译好的dll,连接如下:
http://www.libsdl.org/release/SDL-devel-1.2.14-mingw32.tar.gz
然后解压, 将其中的bin, lib, include 3个文件夹拷贝到mingw的目录下, 当询问是否覆盖, 选择是.
到bin目录找到sdl-config.用ultraedit打开. 将PREFIX=后面的值改为c:/mingw
接下来, 编译, 成功获得ffplay.exe.
打开windows命令窗口(cmd.exe). 经入ffmpeg目录, 执行ffplay.exe, 发现崩溃了, 提示gcc的版本太旧, 我晕, 真是有点太繁琐了, 从网站下载最新的gcc集合. 连接如下:
http://cdnetworks-kr-1.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%20Installer/tdm-gcc-4.5.0.exe
安装后在c盘下找到mingw32文件夹, 这就是我们刚才安装gcc, 进入目录将bin, inlude, lib 3个文件夹拷贝到mingw的目录下, 当询问是否覆盖, 选择是.
再一次重新编译.
在dos窗口输入:
ffplay f:/coacol.mp4
回车. 呵呵, 看看到播放画面了.
不过, 还有问题, 我们没有编出ffserver.exe. google一下, 发现要解决这个非常困难. 要自己改脚本文件. 好像没有几个人去这样做. 因此决定放弃. 想在windows自己编译出ffserver只能用cygwin了.
有些附加库可以直接用cygwin下载,方法如下:
http://ffmpeg.org/platform.html#Compilation-under-Cygwin
http://sourceware.org/cygwinports/
到此. 整个编译过程完毕.