• <转自CSDN foxavideo>我自己的FFMpeg编译之路


    <转自> http://blog.csdn.net/huangxiansheng1980/article/details/5713185

    另外:这里有编译好的各个版本的ffmpeg   http://ffmpeg.zeranoe.com/

    为了编译这个东西,快折腾了一个星期了。期间经历了很多痛苦的过程,今天我把整个过程,以及在这个过程的感悟写下来,以备日后查看,也希望能帮到一些像我一样的兄弟姐妹。

    在这一个星期里前前后后加起来总共使用了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://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了.

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

  • 相关阅读:
    DOS批处理命令-SET命令
    DOS批处理命令-注释
    DOS批处理命令-pause
    DOS批处理命令-goto命令
    [2020.8.3]联想 Z5S(L78071) Magisk ROOT 纯净无推广 一键刷机 ZUI_11.1.171
    [2020.8.3]联想 ZUK Z1 Magisk ROOT 纯净无推广 一键刷机 ZUI_
    [2020.8.3]联想 Z5(L78011) Magisk ROOT 纯净无推广 一键刷机 ZUI_11.1.053
    [2020.8.3]联想 Z6 Pro 5G(L79041) Magisk ROOT 纯净无推广 一键刷机 ZUI_11.3.363
    [2020.8.3]联想 Z6 青春版(L38111) Magisk ROOT 纯净无推广 一键刷机 ZUI_11.1.094
    [2020.8.3]联想 Z6 Pro(L78051) Magisk ROOT 纯净无推广 一键刷机 ZUI_11.1.105
  • 原文地址:https://www.cnblogs.com/zzugyl/p/2790417.html
Copyright © 2020-2023  润新知