Windows下,VS2013/MinGW编译FFMPEG 3.3.1版本

来源:互联网 发布:mac上的翻墙软件 编辑:程序博客网 时间:2024/05/18 03:18

【标题写到VS2013/MinGW,是因为我分别用两个编译器试过了。下面会详细说到一些我编译测试过程中一些操作步骤。另外,利用MinGW可以编译出ffplay,利用VS2013不行,估计配置不对,正在研究解决方法。自行编译目前的效果是:利用VS2013编译出来的FFMPEG.exe,可以进行录制屏幕,不过效果没有官方编译的好,应该是参数问题。利用MinGW编译出来的程序,都可以交互使用,但是,我编译的时候,没有声明太多的参数,也没有下载很多第三方库,所以有很多功能是用不了的,详细的参数,要各位去看官方文档,或者直接用configure指令打印出来,配合第三方库编译的资料,请各位搜索一下雷神的博客,里面有说到。】

        最近在学习大名鼎鼎的FFMPEG,想尝试一下做个屏幕录像的学习,花了3天,研究FFMPEG的录像功能简单使用,主要参考雷神的CSDN博客。雷神有两篇文章是关于桌面屏幕录制的,其一是使用命令行,直接用官方已经生成的二进制版本,另外一个就是自己动手编码调用FFMPEG的库实现了。看了看雷神屏幕录像编码实现的那一节生成的是YUV文件,编码封装需要进一步学习,然后发现用官方编译好的exe配合命令行实在方便太多了,官方的可以直接用命令行就能生成了MP4格式。所以,决心看看内部,自然就找到源码身上去了。听闻编译源码是各种打怪升级,自己也想尝试一下,就有了这下面的内容。

        编译不容易,网上找到的资料,有些比较旧的,操作不一样了,我也会在下文中指出来(我的也可能不对),欢迎大家指正,共同进步。我的开发环境是Windows下的,编译的过程中,体会到了编译开源的软件不容易。出现各种传说中的问题。在Windows上面编译FFMPEG真的各种水土不服,又屙又呕,用VS2010 make 的时候报错,怎样都跳不过C99转C89的坑,参考过各种资料,按照给出的方法,还是不行,估计版本又高级了(我第一次编译,17-05-25开始编译)。最终,还是改用了VS2013(有必要说明一下,应该VS2013是可以的,但是,我自己使用的是With Update5的版本,下文也是基于VS2013 Update5的。我电脑也有VS2017,但是VS2017的文件夹架构改动过大,有条件的伙伴们可以对比一下,和VS2015以及以前的都不一样了,VS2017也是make的时候就已经失败了,提示CL.exe不行)。

        直接上干货(也附带了吐槽)。需要的各种道具我统一上传到CSDN(省得大伙还要打怪升级拿道具),因为有些工具需要从一些大的压缩包提取出来,但实际上可能仅仅只用到其中一个小的DLL库,所以,我精简了,去掉了没必要的,保留真正用到的再上传。(一些工具和包分32位,64位。我的是64位的系统,但是呢,64位的工具我没用到,具体版本我在下面详细步骤也会说到。至于为什么这么做嘛。嘿嘿,那是因为我看了一下,发现某些工具的64位08年修改的,32位的11年还更改过,版本也更加新,典型的如pkg-config,另外glib也是。具体用到的版本我下面会说到,也希望其他的朋友尝试一下,都用Win64看看行不行,我就不折腾了)。另外,也放出所有的下载链接(我是从链接下载下来的然后去掉一些不必要的组件,再打包上传的,有些参考资料给出的链接已经失效了,除了CSDN的链接,我不能保证下面给的其他链接百分百有效,只能保证,目前的时间,短期内应该还有效。现在北京时间:发博客的时间)

道具:

道具内容(其中SDL里面只有i686的包,完整的包的话,请到官方下载):
       这里写图片描述
地址:http://download.csdn.net/detail/qq_36113711/9857352

预备工作:

  • 环境:Win10 1703专业版 64位+ vs2013 with update5
  • FFMPEG的源码包:https://github.com/FFmpeg/FFmpeg(github上面估计是最新的版本,master分支的话,可以采用这个,之前编译用的就是github,这次为了确定版本,直接用下面的3.3.1)
  • FFMPEG 3.3.1 源码包:https://ffmpeg.zeranoe.com/builds/(这个网站有个other download,里面有源码包下载,注意找找,页面很简单的,这次就用它,如果希望找历史版本的话,来这里:https://ffmpeg.zeranoe.com/builds/source/ffmpeg/)
  • MinGW的Installer(官网的Download就是链接到sourceforge):https://sourceforge.net/projects/mingw/files/(Cygwin比较庞大,算了算了,还是MinGW)
  • yasm:http://yasm.tortall.net/Download.html(下载对应的版本,记得下载对应版本,我上传的CSDN包32位64位都有,此刻和官网保持相同版本,我用Win32,这个用的时候还要改个名字,其他的原封不动转移,下面会说到)
  • pkg-config:(win32)http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip(我用Win32)
      (win64)http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip
  • pkg-config依赖的包以及pr.exe:https://sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0/(需要下载的是两个包coreutils-5.3.0-bin.zip和coreutils-5.3.0-dep.zip)
  • glib:(win32)http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip(我用Win32)
      (win64)http://ftp.gnome.org/pub/gnome/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip
  • SDL:(可选,就看需要不需要生成ffplay了):http://www.libsdl.org/release/SDL2-devel-2.0.5-mingw.tar.gz
  • 注意,下面这个下载地址,是C99转C89的一个程序,如果用的是2012以及2012以前的话,可能需要用到。我用2010是失败了,但是官网声明是支持2010的。
    c99-to-c89-1.0.3:https://github.com/libav/c99-to-c89/releases(VS2013自带了stdint.h和inttype.h了,这个用2013可以不用下载,我还是强烈建议用2013,省得有后遗症,这是我用VS2010,VS2017编译都失败后得到的教训)

一、安装MinGW:

从sourceforge下载完MinGW的安装器之后,双击mingw-get-setup.exe,然后选择释放的路径安装。默认是是放到C:\MinGW,我就维持默认,没变了。

       SourceForge下载目标
       一路Next

安装完后,会出现一个MinGW Installer,这个才是真正的安装过程。选择basic setup,然后将右边的每一项,右键选择mark for installation

       真正的安装过程

选择完毕后,选择Installatin的Apply Change,确定安装

       Apply

Apply之后就会弹出另外一个框,一直下载下载下载。一个字,等,等到完全安装完之后,MinGW的环境就建立起来了。(关于下载安装是否完全的问题,我安装MinGW的时候碰到了网络问题,没有完全安装,退出的时候MinGW还提醒了一下,所以我又Apply了一次。第二次Apply之后,MinGW就可以退出了,所以,我就默认安装完毕了:)。建议大家可以试一下第一次安装完毕后,再Apply一次,看看有没有作用)

二、配置环境变量,配置依赖的库

【!!!这部分的操作针对我自己的电脑上面,MinGW安装释放到了C盘,请大家根据自己安装的目录去选择!!!我的MinGW路径是:C:\MinGW,也是上面步骤一默认释放到的位置】

  • 将MinGW和msys的bin目录设置到path环境变量中

       这里写图片描述

  • 将下载得到的yasm-1.3.0-win32(我用的是就是这个win32)改名为yasm.exe。放到C:\MinGW\bin中。(查阅资料说yasm不是必要的,但是为了优化,官方推荐加上。)管它呢,做多好过做少,不然编译不过重头来才是遭罪。

  • 将pkg-config.exe(在压缩包里pkg-config_0.26-1_win32.zip,对,这个我用的是win32的,没有用win64的)放到C:\MinGW\bin。(括号开始,纯粹吐槽。在下面的编译步骤中使用pkg-config过程中,会提示缺失好几个DLL。比如intl.dll,搜查资料会让找gettext_runtime,里面有intl.dll。对,找这个gettext,真的要捉迷藏。我必须要吐槽一下。首先pkg-config这个压缩包居然没有需要的DLL,这说不过去,其次,百度第一个地址,包括一些参考资料给出来的地址都是:http://gnuwin32.sourceforge.net/packages/gettext.htm,呵呵,打开之后,我不知道是不是我的问题,其他小伙伴,你们的也是这个状况吗?)

       这里写图片描述

实际上应该使用百度第二个地址,指向的:ftp://ftp.gnu.org/pub/gnu/gettext/。可以找到gettext-runtime-0.13.1.bin.woe32.zip

       这里写图片描述
       这里写图片描述

但是,But,Howerver,然而,这里解压出来的intl.dll没法用。我真的想QWE然后放大R一下。

不过,参考了另外的资料之后,大家可以放下了,不用这个gettext,改用coreutils,这个压缩包包含了pkg-config需要的所有依赖库文件,但是,资料给出来的地址。

       这里写图片描述

我。。我。。。唉。。最后还是靠 众里寻她 给搜出来:https://sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0/,这个地址在前面也给出了。

  • 给pkg-config加上它需要的依赖项以及把pr程序也放出来。从coreutils-5.3.0-bin.zip中,找到bin目录,提取pr.exe,然后放到C:\MinGW\bin中。(如果是下载我上传的CSDN包的话,不需要提取,我只提供了pr.exe,也是为了下载包更小。)。从coreutils-5.3.0-dep.zip中,找到bin目录,提取出来libiconv2.dll和libintl3.dll,注意,这里和参考资料有点相似,但又不一样。提取出来的libiconv2.dll和libintl3.dll先复制一份,将【复制出来的】libiconv2.dll改名为iconv.dll,将【复制出来的】libintl3.dll改名为intl.dll。这样,实际上是有4个文件,分别是libiconv2.dll、libintl3.dll、iconv.dll和intl3.dll。其中,实际上,iconv.dll和libiconv2.dll是等价的,另外的同理。这样做是因为我自己在编译过程中,提示缺失了intl.dll和iconv.dll,然后按照资料做了之后,只将提取出来的改名字之后,再编译又提示缺少libiconv2.dll,所以不得不弄4个两两相等的DLL库出来(我的压缩包都已经弄好是4个了)。将这4个DLL一并放到C:\MinGW\bin中。
  • 从glib_2.28.8-1_win32.zip中,在bin目录下提取出libglib-2.0-0.dll。地方嘛,当然还是扔到:C:\MinGW\bin
  • 这个步骤对于使用vs2013的话,就可以跳过不看了。对于2010和2012的话,下载c99-to-c89-1.0.3.zip之后,将提取的c99conv.exe和c99wrap.exe扔到C:\MinGW\bin。(强烈建议使用2013。反正我用2010这么做还是失败了)

三、【可选】需要ffplay否?(这里保留一下意见,如果用MinGW编译的话,就这么做,如果用VS2013的话,就没必要做这一组操作。可能是我没配置好的原因,没有把SDL的库放到了VS2013中去,我用2013出不来,也不想把SDL的东西放到VS2013中目录去,用MinGW倒是把ffplay编译出来了。当然,这种没必要带来的后果就是,VS2013没有编译到ffplay,如果很在乎ffplay的话,请使用MinGW,下面在第四组操作会分别就VS2013和MinGW进行说明)

如果不需要ffplay的话,这组所有步骤就可以略过了。
如果要把ffplay也编译出来的话,那么:
1、解压SDL2-devel-2.0.5-mingw.tar.gz,得到了好多个东西,选择i686-w64-mingw32这个子目录下的。注意!!!这个很重要,一定一定要选择的是i686的,而不是x86那个(我上传的道具包只有i686版本)。否则ffplay就出不来,我是多次失败,最后才测试出来的。(1.2的版本我发现也出不来,但是看了一下configure,FFMPEG应该支持2.0以上的版本了。)如果2.0的版本用的是x86的话,在./configure指令(下面会说到这个指令)执行后,在工作目录下会有一个config.log,里面会显示SDL不满足条件,从而不生成ffplay

       这里写图片描述

2、将bin目录下的SDL2.DLL和sdl2-config放到C:\MinGW\bin

3、将解压后的include目录下的SDL2目录,整个目录直接拷贝到过去C:\MinGW\include

4、将解压后的lib目录下的所有文件都放到C:\MinGW\lib

5、将解压后的share目录下的那个aclocal文件夹,也整个文件夹拉到C:\MinGW\share,让两个aclocal文件夹的内容合并(其实也就1个文件)

6、等等,还要改些东西,进去C:\MinGW\bin,找到刚刚放进来的sdl2-config这个文件,用【记事本(不是Windows自带的,我用的是EditPlus)】打开它,然后改一些东西。看下图
SDL_MAJOR_VERSION=2
SDL_MINOR_VERSION=0
SDL_PATCHLEVEL=5
prefix=C:/MinGW
includedir=${prefix}/include/SDL2

       这里写图片描述

四、准备进行make & make install吧

准备make之前,还有3个小步骤(不管是MinGW还是VS2013,这三个步骤都做了就对了)。

  • 绑定和vs2013的关联。去到C:\MinGW,找到msys文件夹,进入,最终的路径是C:\MinGW\msys\1.0。然后这个文件夹下面有个msys.bat,右键打开(不要使用Windows自带的记事本,CRLF在Windows上和Linux上不一致,我用EditPlus,伙伴们你们可以用Notepad++)。打开后,在第一行,必须在第一行!!,在第一行加上
    call “C:\Program Files (x86)\Microsoft Visual Studio
    12.0\VC\bin\vcvars32.bat” call后面的路径是我的VS2013的安装路径,请根据自己实际安装的路径改写这句话。其次,有参考资料说对于x64的机器还要配置_WindowsNT,但是,我看了一下这个文件,对比了一下,好像没这个必要。所以只加上这句话就可以了。

       这里写图片描述

  • 进入msys的bin目录,路径是C:\MinGW\msys\1.0\bin,这个目录下有一个link.exe,将这个程序改名,随意改个名字,我改成了link_rename.exe。(为了防止和vs自带的link冲突,编译完FFMPEG之后,记得改回来,恢复为link.exe)。

  • 将下载好的FFMPEG 3.3.1版本的压缩包,解压缩到自己喜欢的工作目录,我这里选择的是解压到D:\FFMPEG目录。


  •        这里写图片描述

针对VS2013的操作

  • 如果使用的是VS2013,还需要额外多一个步骤。
    打开解压后的工作目录,也就是刚刚上图的那个路径,找到ffmpeg.c这个源文件,打开它,我们要在注释后面,第一行#include开始的前面,加上一句话,之后保存:
           #define WIN32_LEAN_AND_MEAN

           这里写图片描述

    (不这么做行不行?不行,不这样做的话,make到差不多一段时间之后,就会挂掉了,出现这个图片,直接winsock2各种重定义。最终的结果就是爆出Error,ffmepg的生成失败,这个可不得了啊。出现这种做法的话,还是得回去加上刚刚那句define,然后重新将下面要提到的指令再走一遍。如果一开始就加上了define的话,一般情况下,运气好的话,一切顺利。)

       这里写图片描述

好了,一切都准备好了,接下来就是开工大吉了。

进入C:\MinGW\msys\1.0,打开msys.bat,然后用命令行转移到D盘的FFMPEG目录下,然后进入到解压后的实际目录ffmpeg-3.3.1。然后输入configure指令。指令的详细解析,雷神的博客有,另外,我也简单说明一下,我是关闭了debug,prefix指定了在当前目录下,到时候生成vs2013_build的文件夹,里面就是编译好的程序,toolchain指明了用VS开工。还有,我需要的是静态库版本,如果是需要DLL和动态链接版本的exe的话,应该加上 –enable-shared(enable前面是两个横杠)的那个选项,具体其他的命令的写法,请查看./configure -h 这个指令。我在markdown这里没法弄出来两条横杠,所以看截图了。对了,我还发现了,如果是shared版本的话,static版本就不会生成。而如果是static版本的话(就是我下图的参数的话),shared版本就不会生成。这两个好像是互斥的,所以,如果又需要static,又需要shared的话,要分开两次编译。

       这里写图片描述

敲完参数之后,直接回车,等。等一大段的出现License,并且返回到命令行后,如下图(顺便留意一下,箭头指向的Enable outdevs,和接下来要说到的MinGW的对比一下)

       这里写图片描述

接着输入 “make”,回车,然后继续等(拼电脑硬件)。make的这段时间,窗口会输出很多要保存为Unicode防止数据丢失的信息,反正我是一个都没管。等make返回到命令行后(这个挺久的,我是等了30分钟),再输入 “make install”,回车,再等。当最后的make install也回到命令行后,运气不错的话,就会在解压缩的工作目录下,生成了prefix指定的文件夹,里面应该就有需要的东西了

       这里写图片描述

针对MinGW的操作

【如果需要ffplay的话,进行第三组的步骤的操作。】
进入C:\MinGW\msys\1.0,打开msys.bat,然后用命令行转移到D盘的FFMPEG目录下,然后进入到解压后的实际目录ffmpeg-3.3.1(为了清理干净一点,我把上面VS2013编译的时候用到的工作目录全部删除了,重新解压了一遍)。然后输入configure指令。这次看截图可以看到我的参数只有一个了。但是大家参照网上其他的资料的时候,使用MinGW的时候,会发现很多很多参数的,需要很多第三方库,大家可以根据需要去做。我只是简单测试编译一下在MinGW下去编译出ffplay和ffmpeg而已。

       这里写图片描述

敲完参数之后,直接回车,等。等一大段的出现License,并且返回到命令行后,如下图(顺便留意一下,箭头指向的Enable outdevs,和上面说到的VS2013的对比一下)

       这里写图片描述

接着输入 “make”,回车,然后等。等make返回到命令行后,再输入 “make install”,回车,再等。当最后的make install也回到命令行后,在C:\MinGW\msys\1.0这个目录下,有一个local的文件夹,里面就存放了编译好的程序了。

       这里写图片描述

五、configure的参数

有些参考资料估计是针对旧版本的,我也搜了一下,发现很多资料推荐带上–enable-memalign-hack(enable前面是两条横杠,不知道为啥CSDN的MarkDown直接合并成了一条,第一次用Markdown),而且说这个是编译成功的唯一选择,但是我带上了这个参数,make的时候,直接提示这是不合法的参数,我去搜索了一下,在地址:
http://ffmpeg.org/pipermail/ffmpeg-cvslog/2011-July/039235.html
这个网页描述,“不推荐带上这个参数,因为目前的版本是自动开启的”,有些标记是+++—的,那应该是git的修改符号
所以我的参数直接去掉了。

       这里写图片描述

参考资料:

http://blog.csdn.net/leixiaohua1020/article/details/12755173
http://blog.csdn.net/bobsweetie/article/details/50858358
http://www.cnblogs.com/lidabo/p/3967473.html
http://www.cnblogs.com/xylc/p/3683203.html
http://blog.csdn.net/isluckyguo/article/details/53086920
http://xpp02.iteye.com/blog/1785015
http://blog.csdn.net/whb_fei/article/details/55506344
http://www.latelee.org/multistream/ffmpeg-2-6-3-windows-mingw-compile-note.html
http://www.cnblogs.com/wanggang123/p/6119534.html
http://www.bubuko.com/infodetail-1854459.html(和上面这个链接是一样的,为的就是解决2010的问题make不成功的问题)
http://blog.csdn.net/xinqingwuji/article/details/53390680(2010按照他的方法做了,还是make不行。版本是3.2.4。新的3.3.1没试过)
http://blog.csdn.net/shuiniu1224/article/details/21888533
http://www.cnblogs.com/lidabo/p/3967478.html
http://www.cnblogs.com/dwdxdy/p/3625766.html
http://blog.csdn.net/sean_xyz/article/details/25190291
http://blog.csdn.net/isluckyguo/article/details/53086920

原创粉丝点击