我自己的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:testffmpage,那么命令就是:

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:cygwinusrlocalbin目录,要看你的cygwin安装到什么地方,我的安装在c盘,所以是C:cygwin。如果是后面的一种编译方式,则是将编译出来的文件拷贝到msys的安装目录,如我的是安装到c盘,就是c:msyslocalbin

 

ffmpeg编译时,还可以根据你cpu 核心的个数,进行编译时间的优化,也就是说当你指定你的cpu为双核时,比你不指定编译要快。例如指定2核心时:

make -j2

 

 通过windows + MinGW + MSYS编译

这种编译方式最为复杂, 也是花去我时间最多的一种.

首先去MinGW的官网下载安装包.

官网是 www.mingw.org

安装包的连接:

http://cdnetworks-kr-1.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/MinGW%205.1.6/MinGW-5.1.6.exe

如果不可用去

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了.

 

到此. 整个编译过程完毕.

 

转载请注明出处,谢谢。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:
This entry was posted in FFMpeg and tagged . Bookmark the permalink.

21 Responses to 我自己的FFMpeg编译之路

  1. 匿名用户 says:

    您好!我现在工作遇到了这个问题,想请教您一下,如方便请给我发封邮件,我的邮箱:qq41170577@sina.com 谢谢!!!

  2. 匿名用户 says:

    好东西~~~偶也试试去~~

  3. tttyd says:

    你好,我使用的是通过windows + Cygwin编译ffmpeg。
    按照你说的方法,使用/usr/bin/set-gcc-default-3.sh编译SDL很顺利,也顺利安装(make install)。然后将编译器设置为4(/usr/bin/set-gcc-default-4.sh),运行./configure,配置ffmpeg,不过sdl support右边一直是no,除了ffplay都能编译通过。奇怪的在(/usr/bin/set-gcc-default-3.sh)环境下,运行./configure,配置ffmpeg,这是sdl support右边是yes,不过可惜的是任何类库都编译不过,很多错误。

    • girlwangzhe says:

      回复 tttyd:
      不知道你的问题有没有解决,我遇到和你一样的问题,使用gcc3.4.4编译不过ffmpeg,使用gcc4.X.X能编过,但是不支持sdl。在gcc3编译出的sdl无法在gcc4中使用。

  4. tttyd says:

    /usr/bin/set-gcc-default-3.sh
    gcc版本是 3.4.4 (cygming special, gdc 0.12,using dmd 0.125)
    /usr/bin/set-gcc-default-4.sh
    gcc版本是 4.3.4 20090804 Release

  5. onicewalk says:

    早看到你的博客就好了[e03][e03]我自己摸索。。浪费了2天时间

  6. timebomb says:

    Cygwin下了半天,竟然给我出来个101%,仍在下载中,真是郁闷[e06]

  7. benqiangchan says:

    博主,你好
    我用你本文的方法3,成功编译ffmpeg,非常感谢。但是我想得到ffserver.exe时,用cygwin时,总是在make这一步出现问题,只出现了5个"CC",问题总围绕"bswap_16,bswap_32,
    bswap_64"上,请指教,感激涕零!

  8. 我是博主,非常感谢各位对这篇的文章关注和支持,你们的观点和问题我都一一拜读了,我也很想去回答你们的问题, 但是时隔已久,很久没有去碰这个东西了,现在只是一些模糊的记忆,我不想用一些模糊的记忆来回答各位。并且最近在研究网络方面的东西,实在很忙,所以不能各位的问题,希望各位谅解。谢谢

  9. qcbf2 says:

    你好,请问下,这个在windows下编译和在linux下编译功能上或者其他编译出来的都是一样的吗?

    • [reply]qcbf2[/reply
      按照一般软件设计的思想,应该是一致的。因为我没有真正的去测试过,所以不能给你肯定答案,你要是测试发现有不一致的地方,不妨提出来,让大家分享。谢谢。

  10. caimo says:

    你好。博主!看了你的文章我编译成功了!非常感谢你!
    但是有个问题:
    我Ubuntu11.04
    安装了SDL现有最新版本,然后Git最新版本ffmpeg
    ./configure –enable-memalign-hack –disable-debug && make编译之后
    发现得到的ffplay可以播放视频,比如./ffplay 1.mpg或者./ffplay 2.flv
    但是都只能看到画面,没有声音,请问这是什么原因呢,如果知道的话,能否麻烦告诉我一下。谢谢!
    qiurc@qq.com

  11. wandertree21 says:

    使用Cygwin,出现bswap_16,bswap_32,bswap_64重复定义的问题,不知道怎么搞了

  12. lecheng124 says:

    我想问下我想在服务器端在上传视频的时候就利用ffmpeg把视频格式转换为flv的格式,然后在网站上嵌入flv格式的流媒体文件,这样现在的智能手机也可以通过这个服务器来观看视频。。。那么ffmpeg 在win7下编译之前应该准备什么来着(下载什么样的包,和平台的搭建什么的),我试着按照网上的方法来做,但是很多都是失败的。。谢谢!!

  13. 第二个环境那个SDL我没弄成功。
    所以一直没有play

Leave a Reply

Your email address will not be published. Required fields are marked *

*