ffmpeg编译

网上有很多版本的ffmpeg编译指南,大部分不可用,不是链接失效,就是不符合我的应用需求。

自己整理一份留作备份:

1、  下载编译环境MinGW+Msys,地址是:http://sourceforge.net/projects/mingwbundle/files/,在这个页面上点击Download下载那个zip文件。下载完成后,直接安装,不建议修改任何默认路径(现在的电脑,C盘空间都大的很)。

MinGW和Msys以前都是分别安装的,现在可以一次性一起安装。可以在线安装,也可以离线安装。推荐离线安装,上面这个链接是用来下载离线安装包的。

2、在http://yasm.tortall.net/Download.html上下载yasm的exe文件(需要根据自己的操作系统选择是Win32.exe还Win64.exe),下载完后重命名为yasm.exe,放到MinGW安装目录的bin目录下。

如果没有这一步操作,在后面编译ffmpeg的过程中,可能会提示找不到yasm命令。ffmpeg里面的汇编加速部分的代码需要用到它,如果禁用汇编加速,会影响编译出来的编解码库的运行效率。

3、下载ffmpeg,在http://ffmpeg.org/download.html可以找到最新的版本,我下载的是http://ffmpeg.org/releases/ffmpeg-0.8.5.tar.gz。下载完成后解压到某处待命。

4、通过桌面或开始菜单的快捷方式,进入MinGW的命令行,进入ffmpeg的解压目录。

注意:切换盘符用“cd 盘符”命令,如“cd d: ”表示切换到d盘。

5、使用configure命令配置ffmpeg的编译参数。我配置的参数如下(仅供参考):

./configure --enable-shared --enable-gpl --enable-version3 --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-w32threads --disable-network --enable-memalign-hack --disable-everything --enable-decoder=h264 --enable-decoder=mpeg2video --enable-parser=h264 --enable-encoder=mpeg2video --disable-debug

通过./configure --help可以查看帮助,上面的每一个参数,都可以在帮助中找到说明;

由于我仅仅需要ffmpeg用来完成MPEG2视频的编码和解码,H.264视频的解码,因此我在上面的参数中,禁用了大量我用不着的内容。一方面加快编译的速度,另外一方面编译出来的库会比较小。

6、输入make进行编译。

7、编译完成后,输入make install进行部署。

如果没有修改过msys的安装路径,那么生成的文件会部署在“C:\msys\1.0\local”目录下。

生成的动态库在“msys目录\local\bin”目录下;

链接库文件在“msys目录\local\lib”目录下的,*.dll.a为动态库需要的链接文件,*.a为纯静态库(不依赖dll);修改扩展名为.lib就可以用了。

需要的头文件在“msys目录\local\include”目录下。







1.写在ffmpeg编译前

关于ffmpeg的编译过程google一搜,一大堆,ffmpeg编译真的有那么难么?在我编译成功后回头来看,网上的资料过多,反而使自己走了很多的弯路。即便有些楼主亲自测试后编译成功了,由于受机器的环境、ffmpeg版本、以及个人操作的影响,导致在自己编译的时候不成功。

有些帖子发表的时间已经很久了,其中提到的到的软件现在也有了很大的更新,就如我后面提到的MinGW,较新的版本直接安装就可以了,无需手动更新一些文件。我写这篇文章的时间是2011/08/30。

系统环境:

操作系统:Windows 7 家庭普通版 Service Pack 1

Ffmpeg版本:ffmpeg-0.6.3,ffmpeg-0.6

开发环境:VS2008

注:

1) win7下的用户要特别注意了,之前我在参考:http://www.chinavideo.org/viewthread.php?tid=9129&extra=page%3D1&page=1 

中的帖子编译ffmpeg-0.6.3时,能够生成lib文件,但在调用这些lib库时却出现了莫名奇妙的问题,而且在我make install时也出现了permission deny的错误。这想问题应该出在,Msys和MinGW时没有使用管理员权限安装。

2) 关于ffmpeg的版本,我在编译ffmpeg-0.6.3时,能够生成lib文件,但在编译ffmpeg-0.6时,却生成的是.dll.a和.def后缀的文件,关于这个问题,文章后面会有解决方法。

1.1 MinGW安装以及ffmpeg0.6编译lib

安装过程和相关软件的下载是参照这篇帖子:http://zhaostudy2.blog.163.com/blog/static/13535020520110179271153/

但仍有几个重要的细节需要补充下:

1) Win7下的用户在安装MinGW时,要选择“以管理员身份运行”,这样会避免在编译ffmpeg-0.6.3时,生成的lib文件不能用的问题。同样的,在运行Msys时,也要选择“以管理员身份运行”。

2) 楼主提供的在csdn上提供的ffmpeg0.6我在照他的配置后并不能生成动态库(lib),在官方网站上下载的ffmpeg0.6还是不能自动生成动态库(lib),有可能是自带MakeFile的问题。在该文章的留言中,也有用户反映了这个问题。

3) Source forge上面的那个链接页面已经更改,“Tools”文件夹已经消失,还好楼主在csdn上有备份,不得不佩服楼主的先见之明。

1.1.1 ffmpeg0.6编译后不能生成lib文件的解决步骤:

以make后的ffmpeg0.6\libavcodec目录下为例,注意到在该目录中有一个avcodec-52.def的文件,对于该文件,在VS中是可以直接将def文件转换成lib文件的!

关于如何转换,直接参考:

http://blog.163.com/zhucongdzkd@126/blog/static/1399971932010814111127686/

里面也提到关于“没有找到mspdb80.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”的解决方案。

我的命令行参数如下图所示:

ffmpeg编译_第1张图片

生成的lib可用!问题解决!

2.最终的编译文档

为防止前面引用的文章无法访问,我再将我的编译过程整理如下:

2.1MinGW下载及安装

1) MinGW下载地址:http://download.csdn.net/source/2988856

2) MinGW安装:win7下选择“以管理员身份运行”运行exe文件,后面步骤使用默认选项安装即可

2.2下载及编译ffmpeg0.6.3动态链接库

Ffmpeg0.6.3是可以直接编译生成动态链接库及.lib文件的。

Ffmpeg0.6.3官方下载地址:http://ffmpeg.org/releases/ffmpeg-0.6.3.tar.bz2

以管理员身份运行”运行MinGW32\MSYS\msys.bat文件

执行以下3条命令,

[plain]  view plain copy
  1. cd /E/ffmpeg0.6.3  
  2. ./configure --enable-shared --disable-static --enable-memalign-hack   
  3. make  
ffmpeg编译_第2张图片

漫长的等待...


make


执行完以上3条命令后在E:\ffmpeg0.6.3\libavcodec下就可以找到avcodec-52.lib和avcodec-52.dll,其他几个lib开头的文件夹下也有相应的.lib文件和.dll文件,至此,ffmpeg编译动态链接库成功完成。

2.3下载及编译ffmpeg0.6动态链接库

Ffmpeg0.6官方下载地址:http://ffmpeg.org/releases/ffmpeg-0.6.tar.bz2

前面步骤与编译ffmpeg0.6时一致,但只生成了dll文件和def文件,没有生成lib文件。

后面就要使用VS2008中提供的lib.exe工具将def文件转换成lib文件。

1) 在C:\Program Files\Microsoft Visual Studio 9.0\VC\bin下双击lib.exe文件。若弹出“没有找到mspdb80.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”

将C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\mspdb80.dll复制到C:\Program Files\Microsoft Visual Studio 9.0\VC\bin下,再次双击lib.exe文件,lib.exe就可以正常启动了。

ffmpeg编译_第3张图片

注意:为避免今后使用VS遇到问题,在成功生成lib文件后,要将mspdb80.dll从C:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录下删除。

2) 假设avcodec-52.def文件位于C:\test目录下,执行如下命令:

lib /out:c:\test\avcodec.lib /machine:IX86 /def:C:\test\avcodec-52.def

即可生成lib文件

ffmpeg编译_第4张图片

至此,所有问题圆满解决

重要补充!!!

与我的解决方法很相似,但更加详细,还提到了无法生成.def文件时,修改config.mak文件的方法。http://blog.csdn.net/xiajia/article/details/6533182





windows下用vs2010编译ffmpeg

 
   
 
(注意:请务必先阅读:七,后记补充:)
ffmpeg是一个开源的多媒体库,使用非常广泛。
在linux下编译ffmpeg非常简单,而在Windows下编译就不是那么容易了。一般在windows下使用MinGW的gcc toolchain进行编译,这样的话,因为ffmpeg的导出函数均是C风格,因而gcc编译的lib可以被vs链接。但是gcc的debug符号与vs的debug符号(*.pdb)是无法兼容的,因此我们用vs来开发基于ffmpeg的程序时无法深入ffmpeg内部进行debug,这不管对于学习还是工程使用都不是那么友好。因而,使用同一套编译系统好处多多。
本篇博文向你展示从头到尾怎么在windows下用vs2010编译ffmpeg,以及一个基于ffmpeg的栗子。同样适合于vs2012/vs2013等。
color="#ff0000">注:请不要用这篇博文的方法去尝试在VS2010以下版本编译ffmpeg,我试过在vs2005中编译,各种问题!官方也没有在vs2010以下版本中进行过编译测试。
一,下载ffmpeg及第三方程序:
1,ffmpeg官网:http://ffmpeg.org/ 
2,ffmpeg git 地址 : git://source.ffmpeg.org/ffmpeg.git (注意:clone代码之前先在git命令行中设置!!!:git config --global core.autocrlf false )
3,MinGW : http://www.mingw.org/ ,运行下载的MinGW安装管理器,包含msys。假设安装好后MinGW路径为:d:/MinGW ,则msys路径应为:d:/MinGW/msys 。将:d:/MinGW/bin和d:/MinGW/msys/1.0/bin加到系统path环境变量中;
4,yasm : http://yasm.tortall.net/ , 改名叫yasm.exe,复制到:d:/MinGW/msys/1.0/bin 目录下;
/********************如果是vs2013 + ,则下面两个(5,6)不需要安装 ***********************/
5,c99-to-c89 : https://github.com/libav/c99-to-c89/downloads , 将c99conv.exe和c99wrap.exe复制到:d:/MinGW/msys/1.0/bin 目录下;
6,C99头文件inttypes.h和stdint.h : http://code.google.com/p/msinttypes/downloads/list ,将此两个头文件复制到: D:Program Files (x86)Microsoft visual Studio 10.0VCinclude 目录下(自行修改为自己的安装目录);
 
二,编译之前的设置:
1,复制:d/MinGW/msys/1.0/msys.bat 到同目录下,改名叫做msys_vs2010.bat,在msys_vs2010.bat开头部分添加:call "D:Program Files (x86)Microsoft Visual Studio 10.0VCbinvcvars32.bat" ;
2,重命名 d:/MinGW/msys/1.0/bin/link.exe 为link_renamed.exe ,这一步是防止这个link.exe与vc的link.exe发生冲突,编译完成之后记得修改回来;
2,打开msys_vs2010.bat,切换到ffmpeg目录下。
到这里为止,所有的编译之前的工作就完成了。
 
三,配置编译:
1,配置:ffmpeg编译配置选项很丰富,详细请运行“./configure --help > ffmpegcfg.txt ”查看其选项。这里我的选项是:
静态库:./configure --enable-static --prefix=./vs2010_build --toolchain=msvc 
动态库:./configure --enable-shared --prefix=./vs2010_build --toolchain=msvc
2,编译:make & make install ;
3,修改回来重命名的 d:/MinGW/msys/1.0/bin/link_renamed.exe 为 link.exe 。
编译时间与机器性能相关,可能会很慢。
至此在vs2010_build就生成了编译好的ffmpe库,有4个目录,bin、include、lib、share 。


-------------------------------------
如果报cl错误,或者C什么东西的 是命令写错了,用上面的命令




四,一个栗子:
OK,ffmpeg编译成功,让我们以一个栗子结束这次编译体验。
在 vs2010_build/share/ffmpeg/examples 目录下有若干个示例。
我们随便找一个 avio_reading.c 拖到我们的test_ffmpeg工程(vs2010),记得在这之前要配置include与lib路径(很简单,就不详细说了)。
链接库中加入: ws2_32.lib;libavcodec.a;libavdevice.a;libavfilter.a;libavformat.a;libavutil.a;libswresample.a;libswscale.a;
编译,链接,运行,OK!
五,注意:
1,在C++源文件中include ffmpeg头文件时需要加上:
#ifdef __cplusplus 
extern "C"{ 
#endif
//… includes
#ifdef __cplusplus 

#endif,
2,ffmpeg使用的是C99,但是坑爹微软直到vs2012好像都还是C89,所以不排除使用中会有些头文件中宏、函数会出编译错误。
常见错误:(此处为骗搜索流量记,严格按照本篇博文步骤的童鞋应该不会出现如下错误) 
1, configure时出现“c99wrap cl is unable to create an executable file.” 且在config.log中最后发现“Command line error D8021 : invalid numeric argument”,你可能在用vs2010以下版本。官方未对此版本进行测试,所以,最好还是用新版本的vs。 
2, configure时出现“c99wrap cl is unable to create an executable file.” 且在config.log中最后发现“link: invalid option -- o”,是因为msys/1.0/bin/link.exe与vs的link.exe冲突,将msys/1.0/link.exe临时改下名字,比如link_gnu.exe,编译完成后再改回来。
六,参考:
1,http://ffmpeg.org/platform.html#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows 
2,http://stackoverflow.com/questions/17218902/connect-ffmpeg-to-visual-studio-2008 
3,https://github.com/xylcbd/ffmpeg_study
4,https://trac.ffmpeg.org/ticket/2610
七,后记补充:
很遗憾的告诉大家,ffmpeg源代码还是蛮坑的,充斥着类似于下面的代码:
  if (CONFIG_H264_VDPAU_DECODER && h->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) ff_vdpau_h264_picture_start(h);
这里,CONFIG_H264_VDPAU_DECODER是一个宏,在configure时关掉这个宏,那么ff_vdpau_h264_picture_start函数应该是永远不可能执行到,然后这段会被编译器给优化掉。但,如果你想debug进去看ffmpeg的代码,那你就不应该打开编译器的优化选项(设置:--disable-optimizations),如此以来将使得编译器在这个obj中加上外部ff_vdpau_h264_picture_start符号,但实际上因为configure设置,外部某个包含此符号的cpp并没有被编译,链接时链接器试图查找这个符号,没有找到,则产生link error。
打开优化选项,同时enable debug(--disable-optimizations --enable-debug=3)。可以进行debug,但可能看的很不爽,有的函数进不去,有的函数会跳来跳去(单步debug时)。
大家,三思。

















--------------------------整合环境。
4)系统整合
  复制X:\msys\etc\fstab.sample为X:\msys\etc\fstab,用文本编辑器打开X:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:
  X:/mingw /mingw
  改为:
  X:/msys/mingw /mingw



In file included from libavformat/hlsenc.c:26:0:
c:\mingw\include\unistd.h:79:1: error: expected ',' or ';' before 'int'
 int __mingw_sleep( unsigned long, unsigned long );
 ^
In file included from libavformat/hlsenc.c:26:0:
c:\mingw\include\unistd.h:105:1: error: expected ',' or ';' before 'int'
 int nanosleep( const struct timespec *, struct timespec * );
 ^
c:\mingw\include\unistd.h:125:28: error: expected ',' or ';' before 'usleep'
 int _cdecl __MINGW_NOTHROW usleep( useconds_t )__MINGW_ATTRIB_DEPRECATED;
                            ^
c:\mingw\include\unistd.h:138:10: error: conflicting types for '_cdecl'
 unsigned _cdecl __MINGW_NOTHROW sleep( unsigned );
          ^
c:\mingw\include\unistd.h:125:5: note: previous declaration of '_cdecl' was here


 int _cdecl __MINGW_NOTHROW usleep( useconds_t )__MINGW_ATTRIB_DEPRECATED;
     ^
c:\mingw\include\unistd.h:138:33: error: expected ',' or ';' before 'sleep'
 unsigned _cdecl __MINGW_NOTHROW sleep( unsigned );
                                 ^
c:\mingw\include\unistd.h:153:12: error: expected '=', ',', ';', 'asm' or '__att
ribute__' before 'ftruncate'
 int _cdecl ftruncate( int, off_t );
            ^
libavformat/hlsenc.c: In function 'hls_window':
libavformat/hlsenc.c:271:5: warning: format '%d' expects argument of type 'int',
 but argument 3 has type 'int64_t' [-Wformat=]
     avio_printf(out, "#EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence);
     ^
libavformat/hlsenc.c:274:12: warning: format '%d' expects argument of type 'int'
, but argument 4 has type 'int64_t' [-Wformat=]
            sequence);
            ^
libavformat/hlsenc.c:280:26: warning: format '%i' expects argument of type 'int'
, but argument 3 has type 'int64_t' [-Wformat=]
                          en->size, en->pos);
                          ^
libavformat/hlsenc.c:280:26: warning: format '%i' expects argument of type 'int'
, but argument 4 has type 'int64_t' [-Wformat=]

make: *** [libavformat/hlsenc.o] Error 1


编译以下文件:

libavutil\file.c
libavutil\file_open.c
libavutil\log.c
libavutil\random_seed.c
libavutil\time.c
libavformat\cache.c
libavformat\dashenc.c
libavformat\file.c
libavformat\hdsenc.c
libavformat\smoothstreamingenc.c
libavformat\hlsenc.c
libavcodec\libxvid.c
libavcodec\libxvid_rc.c
ffmpeg.c

都有这个错误。其实是没有找到 _EXTERN_C _cdecl __MINGW_NOTHROW ,其在 window.h 中。


解决办法:在以上文件中, #include 之前加上 #include



---------------------

1 下载 MinGW 和 MSYS
    MinGW(Minimalist GNU on Windows):一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时库。
    到:
http://sourceforge.net/projects/mingw/ 去下载即可 
    A 点击“DownLoad mingw-get-inst-...exe”
    B 切换到页面:download? Check your browser's security bar, or try a direct link, or try another mirror.
    C 点击“direct link”下载类似:mingw-get-inst-20111118.exe 的文件
    提示:msys此处就不用再下载了,mingw-get-inst-20111118.exe 中已经包含了msys1.0,后面安装的时候就可以看到该选项。
2 下载 yasm(汇编编译器)
    ffmpeg编译的时候里面的汇编代码需要yasm.exe
    去官网:
http://yasm.tortall.net/Download.html 下载
    在Latest Release栏,直接下载:Win32 .exe (for general use on 32-bit Windows) 
    文件名类似为:yasm-1.2.0-win32.exe
3 下载 ffmpeg
    ffmpeg可以到 
http://www.ffmpeg.org/releases/ 下载
    选择的一个最新版本下载即可,如:ffmpeg-0.8.6.tar.gz 
    文件名类似为:ffmpeg-0.8.6.tar.gz
    当然你也使用网上介绍的使用SVN直接下载源代码的方法。  
    svn://svn.mplayerhq.hu/ffmpeg/trunk
4 下载 mp3lame(支持mp3,可选项)
    为了让编译出来的ffmpeg支持对mp3格式的编解码,您需要先下载lame。
    到:
http://sourceforge.net/projects/lame/files/ 下载 
    文件名类似为:lame-3.99.2.tar.gz 的包。
5 下载 x264(支持x264,可选项)
    为了让编译出来的ffmpeg支持对x264格式的编解码,您需要先下载x264。
    到:
http://www.videolan.org/developers/x264.html下载 
    文件名类似为:last_x264.tar.bz2 的包。
6 下载 Xvid(支持Xvid,可选项)
    为了让编译出来的ffmpeg支持对Xvid格式的编解码,您需要先下载Xvid。
    到:
http://www.xvid.org/ 下载 
    文件名类似为:xvidcore-1.3.2.tar.gz 的包。
7 下载 faad2(支持faad,可选项)
    到:
http://www.audiocoding.com/downloads.html 下载:Version 2.7 bootstrapped TAR.GZ Package
    文件名类似为:faad2-2.7.tar.gz 的包。
8 下载 faac(支持faac,可选项)
    到:
http://www.audiocoding.com/downloads.html 下载:Version 1.28 bootstrapped TAR.GZ Package
    文件名类似为:faac-1.28.tar.gz 的包。
9 下载 aacenc(支持aac,可选项)
    到:
http://sourceforge.net/projects/opencore-amr/files/ 下载:vo-aacenc
    文件名类似为:vo-aacenc-0.1.1.tar.gz 的包。
10 下载 amr-nb与amr-wb (早期ffmpeg支持3gp,可选项)
    到:
http://www.penguin.cz/%7Eutx/amr 下载:amrnb-7.0.0.2.tar.bz2与amrwb-7.0.0.4.tar.bz2
    文件名类似为:amrnb-7.0.0.2.tar.tar 与amrwb-7.0.0.4.tar.tar 的包。
11 下载 opencore-amr与vo-amrwbenc (支持3gp,可选项)
    到:
http://sourceforge.net/projects/opencore-amr/files/ 下载:opencore-amr 与 vo-amrwbenc
    文件名类似为:opencore-amr-0.1.2.tar.gz 与vo-amrwbenc-0.1.1.tar.gz 的包。
12 下载 SDL(支持SDL,可选项)
    SDL下载可以到:
http://www.libsdl.org/download-1.2.php
    在Source Code栏选择类似:SDL-1.2.14.tar.gz - GPG signed 进行下载,
    文件名类似为:SDL-1.2.14.tar.tar,此文件需要编译才能生成lib库。
    也可以直接下载 SDL-devel-1.2.14-mingw32.tar.gz (Mingw32),文件名类似为:SDL-devel-1.2.14-mingw32.tar.tar,此文件带有编译好的lib,在编译ffmpeg时可以直接使用。
13 下载 pthreadGC2.dll
    pthreadgc2.dll是功能强大的处理数字化影视作品编辑软件premiere6运行所需的一个DLL文件。这是一个无威胁文件。属于Open Source Software community project的文件。
    直接去baidu.com三搜索下载就可以了。
二 编译步骤
1 安装 mingw 和 msys
    执行下载文件:mingw-get-inst-20111118.exe,
    在第3步选择“Download latest repository catalogues”
    选择安装路径:C:\MinGW(我直接采用默认路径,未做修改)
    在“Select Components”步骤中选择:
      √  C Compiler (默认且一定选择)
      √  C++ Compiler
      √  MSYS Basic System(选择此项将会安装msys,msys则不需要另外安装)
      √  MinGW Developer ToolKit
    等待安装完成!(需要等待一定的时间,因为安装过程需要下载文件,可想而知,网速越快,安装越快)
    安装完成后,在C:\MinGW目录下可以看到 msys 文件夹,msys也已经安装。
2 配置 msys.bat 批处理文件
    为了方便VS200X以及VS2010调用ffmpeg的动态库,可以通过配置让ffmpeg编译时产生windows下调用dll对应的lib,当然,如果你没有这个需要,那么就可以省略以下处理,直接进入步骤3。
    进入:C:\MinGW\msys\1.0\文件夹,使用UltraEdit打开msys.bat文件,在文件的最最前面加入如下一行:
    call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
    添加后效果如下:
      
call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
         @echo off
         rem Copyright (C):  2001, 2002, 2003, 2004, 2005  Earnie Boyd
         rem   
mailto:[email protected]
         rem This file is part of Minimal SYStem
         rem   
http://www.mingw.org/msys.shtml
         rem
         rem File:     msys.bat
         rem Revision:     2.4
         rem Revision Date:  December 8th, 2005
         rem ember to set the "Start in:" field of the shortcut.
         rem A value similar to C:\msys\1.0\bin is what the "Start in:" field needs
         rem to represent.
    其中“D:\Program Files\Microsoft Visual Studio 10.0”为你机器上安装VS200X或VS2010的目录,我的电脑安装的是VS2010,并且安装在了D盘。文件修改后保存即可。
3 系统整合
    使用UltraEdit修改C:\MinGW\msys\1.0\etc目下的fstab文件,如果不存在fstab,请复制一份fstab.sample,然后改名为:fstab,再修改其内容为:C:/MinGW /mingw,也即为MinGW的安装路径。
4 配置 yasm
    为了减少配置环境变量的麻烦,本处直接把 yasm-1.1.0-win32.exe 文件名修改成:yasm.exe,并放到系统目录下:C:\WINDOWS\system32。
5 编译 mp3lame(可选项)
    lame-3.99.2.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,切换到lame目录:D:\ffmpeg\lame-3.99.2
    $ cd /d
    $ cd ffmpeg
    $ cd lame-3.99.2
    再执行以下命令:
    $./configure --disable-shared (首选)
或: $./configure --disable-static --enable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
6 编译 x264(可选项)
    last_x264.tar.bz2 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,切换到x264目录:D:\ffmpeg\x264-20111124-2245
    $ cd /d
    $ cd ffmpeg
    $ cd x264-20111124-2245
    再执行以下命令:
    $./configure --enable-shared --disable-asm
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
7 编译 Xvid(可选项)
    xvidcore-1.3.2.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,切换到xvidcore目录:D:\ffmpeg\xvidcore\build\generic
    $ cd /d
    $ cd ffmpeg
    $ cd xvidcore/build/generic
    再执行以下命令:
    $./configure --prefix=C:/MinGW/msys/1.0/local
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下。
    需要注意的就是:此处编译加上了路径
    如果make时出现:cc1.exe: error: unrecognized command line option '-mno-cygwin' 错误,请在./configure后make之前修改xvidcore\build\generic里的 platform.inc文件,直接删除里面的“-mno-cygwin”。 
    具体可以参考:
http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=111里2楼的回答,如果按他说的:I recommend re running ./bootstrap.sh after you do this.,我发现不太行,一运行bootstrap.sh后,platform.inc文件会被还原,并且./configure时也会还原该文件,所以我选择在./configure后make前修改,可以编译通过,目前没检验Xvid是否可用。
8 编译 faad2(可选项)
    faad2-2.7.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到faac2目录:D:\ffmpeg\faad2-2.7
    $ cd /d
    $ cd ffmpeg
    $ cd faad2-2.7
    再执行以下命令:
    $./bootstrap
    $./configure --disable-static --enable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
9 编译faac(可选项)
    faac-1.28.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到faac2目录:D:\ffmpeg\faac-1.28
    $ cd /d
    $ cd ffmpeg
    $ cd faac-1.28
    再执行以下命令:
    $./bootstrap
    $./configure --disable-static --enable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
10 编译vo-aacenc (可选项)
    vo-aacenc-0.1.1.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到vo-aacenc目录:D:\ffmpeg\vo-aacenc-0.1.1
    $ cd /d
    $ cd ffmpeg
    $ cd vo-aacenc-0.1.1
    再执行以下命令:
    $./configure --disable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
11 编译amr-nb和amr-wb (早期ffmpeg版本,可选项)
    在编译amrnb和amrwb之前还需要做点其它的准备工作:
    A 先到网上搜索下载wget工具,解压后放到C:\MinGW\bin目录下,此工具是个网络下载工具,用来在编译时自动下载3gpp源码。 
    B 再先到
http://downloads.sourceforge.net/gnuwin32/unzip-5.51-1-bin.zip 下载unzip-5.51-1-bin.zip后进行解压,并把unzip-5.51-1-bin\bin中的unzip.exe拷贝到C:\MinGW\bin目录下,此工具用来在编译时自动解压3gpp源码。
    amrnb-7.0.0.2.tar.tar 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到amrnb目录:D:\ffmpeg\amrnb-7.0.0.2
    $ cd /d
    $ cd ffmpeg
    $ cd amrnb-7.0.0.2
    再执行以下命令:
    $./configure --disable-static --enable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
    amrwb-7.0.0.4.tar.tar 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到amrwb目录:D:\ffmpeg\amrwb-7.0.0.4
    $ cd /d
    $ cd ffmpeg
    $ cd amrwb-7.0.0.4
    再执行以下命令:
    $./configure --disable-static --enable-shared
    $ make
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
12 编译opencore-amr 和vo-amrwbenc (可选项)
    opencore-amr-0.1.2.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。
    如果是opencore-amr-0.1.1.tar.gz请注释掉以下Makefile中的几行
    文件: ./opencore-amr/amrnb/Makefile
    install: libopencore-amrnb.a $(SHLIB)
    install -d $(DESTDIR)$(PREFIX)/lib
    install -m 644 libopencore-amrnb.a $(DESTDIR)$(PREFIX)/lib
    # install $(SHLIB) $(DESTDIR)$(PREFIX)/lib
    ifneq ($(shell uname), Darwin)
    # ln -sf $(SHLIB) $(DESTDIR)$(PREFIX)/lib/$(SONAME)
    # ln -sf $(SONAME) $(DESTDIR)$(PREFIX)/lib/libopencore-amrnb.so
    endif
    文件: ./opencore-amr/amrwb/Makefile
    install: libopencore-amrwb.a $(SHLIB)
    install -d $(DESTDIR)$(PREFIX)/lib
    install -m 644 libopencore-amrwb.a $(DESTDIR)$(PREFIX)/lib
    # install $(SHLIB) $(DESTDIR)$(PREFIX)/lib
    ifneq ($(shell uname), Darwin)
    # ln -sf $(SHLIB) $(DESTDIR)$(PREFIX)/lib/$(SONAME)
    # ln -sf $(SONAME) $(DESTDIR)$(PREFIX)/lib/libopencore-amrwb.so
    endif
    切换到opencore-amr目录:D:\ffmpeg\ opencore-amr-0.1.2
    $ cd /d
    $ cd ffmpeg
    $ cd opencore-amr-0.1.2
    再执行以下命令:
    $./configure --disable-shared
    $ make CC=gcc
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
    vo-amrwbenc-0.1.1.tar.gz 接压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,已经启动的话就不用再重新启动了。切换到vo-amrwbenc目录:D:\ffmpeg\ vo-amrwbenc-0.1.1
    $ cd /d
    $ cd ffmpeg
    $ cd vo-amrwbenc-0.1.1
    再执行以下命令:
    $./configure --disable-shared
    $ make CC=gcc
    $ make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下
13 编译SDL(可选项)
   SDL-1.2.14.tar.tar 解压到:D:\ffmpeg\ 目录下, 双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,切换到SDL目录:D:\ffmpeg\SDL-1.2.14,切换方法如下:
    $ cd /d
    $ cd ffmpeg
    $ cd SDL-1.2.14
    再执行以下命令:
    ./configure
    make
    make install
    编译结果在:C:\MinGW\msys\1.0\local 目录下 

    注意:如果是使用编译好的SDL-devel-1.2.14-mingw32.tar.tar,那么就可以省掉上面的编译工作,直接解压SDL-devel-1.2.14-mingw32.tar.tar文件即可。自己编译或直接使用编译好的都需要做下面的修改和拷贝工作。
    使用UltraEdit打开C:\MinGW\msys\1.0\local\bin下的 sdl-config文件
    把 prefix=/usr 该成: prefix=c:/mingw
    其中:c:/mingw 为 mingw的安装路径,请根据你的安装进行修改。为了编译时msys能识别sdl并开启 SDL support yes 进行编译,请把C:\MinGW\msys\1.0\local编译结果bin、include和lib中有关sdl的拷贝一份到C:\MinGW\的对应目录中。
14 拷贝编译结果
    C:\MinGW\msys\1.0\local  到 D:\ffmpeg\ffmpeg-0.8.6
    bin拷贝到 bin中
    include拷贝到 include中
    lib拷贝到 lib中
    当然该拷贝过程你可以不做,只要在编译的时候把路径指到:C:\MinGW\msys\1.0\local里面。
15 编译 ffmpeg
    ffmpeg-0.8.6.tar.bz2 解压到:D:\ffmpeg\ 目录下,双击“C:\MinGW\msys\1.0\msys.bat”,启动“MinGW32”,切换到ffmpeg目录:D:\ffmpeg\ffmpeg-0.8.6,切换方法如下:
    $ cd /d
    $ cd ffmpeg
    $ cd ffmpeg-0.8.6
    如果你的“MinGW32”没有关闭,可以直接切换路径到:D:\ffmpeg\ffmpeg-0.8.6。
    再执行以下命令:
    $ ./configure --enable-shared --disable-static --enable-ffplay
    --enable-nonfree --enable-memalign-hack
    --enable-libmp3lame
    --enable-gpl--enable-libx264   
    --enable-libxvid
    --enable-faad --enable-libfaac
    --enable-libvo-aacenc
    --enable-version3 --enable-libopencore-amrnb   
    --enable-libopencore-amrwb --enable-libvo-amrwbenc
    --extra-cflags=-Id:/ffmpeg/ffmpeg-0.8.6/include
    --extra-ldflags=-Ld:/ffmpeg/ffmpeg-0.8.6/lib
    请耐心等待一段时间,以上命令不能直接换行哦并且根据ffmpeg的版本不同有所变化,具体看./configure --help,你知道的。。。
    $ make
    需要等待很长一段时间,等待编译结束。
    为了汇总编译结果,请继续执行以下命令:
    $ make install
    等待完成,在C:\MinGW\msys\1.0\local中将会生成 bin、include、lib等文件夹,其中包含了ffmpeg.exe、ffplay.exe、ffprobe.exe、dll、lib和头文件等。
16 运行测试
    直接双击运行”ffplay.exe”,如果提示没有“pthreadGC2.dll”文件,你可以包“pthreadGC2.dll”直接拷贝到当前目录,也可放到系统目录C:\WINDOWS\system32中。

ffplay f:/xxx.mp4


参考:
http://blog.csdn.net/yangshu168/archive/2010/01/17/5204269.aspx
http://blog.csdn.net/himulakensin/article/details/6693457
http://blog.csdn.net/huangxiansheng1980/article/details/5712003



------------------

特别提示我用最新版本的ffmpeg结果不支持SDL2.0!!!!!


-----------------------------

2.编译x265-1.3

x264x265ffmpeg等都需要yasm编译器,需要将yasm编译器下载,复制到ming/bin目录下。

X265需要安装cmake来生产工程文件,需要下载最新的cmake-2.8.12版本,并安装,注意需要将其安装路径加入windows环境变量的PATH变量下。

2.1 使用mingw的命令行进入到x265/build/msys目录,执行 make-Makefiles.sh

ffmpeg编译_第5张图片

先点下面的configure,然后点generate即可,然后关闭,回到命令行。同上面的执行make 然后是 make install。最后编译成功应该可以找到对应的lib文件在/loacal/lib目录下。

-----------------------

勾掉CLI,勾上xp_support。

3.1. Ffmpeg编译配置选项

x264x265编译后的头文件,静态库文件copy/usr/local/对应的目录下ffmpeg编译_第6张图片

ffmpeg编译_第7张图片

tyd.sh文件copyffmpeg-2.3.3目录下。运行tyd.sh脚步即可

3.2 运行编译选项存在的问题

ERROR: x265 not found

3.2.1. 缺少pkg-config程序、缺少x265.pc文件

ffmpeg编译_第8张图片

查看config.log日志文件,根据以下的错误信息,应该是缺少pkg-config程序,以及缺少对应的x265.pc文件。

ffmpeg编译_第9张图片

pkg-config程序的安装参考一下文章,或者直接下载pkg-config copy/ming/bin目录下

pkg-config

安装  http://blog.csdn.net/chaosllgao/article/details/3984462

下载  http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config-0.23-2.zip

x265.pc文件copy /usr/local/lib


可以通过pkg-config得到x265相关的文件信息。

3.2.2 config.log错误日志信息

a) 缺少gcc依赖库

  如下图所示,链接new\delete函数失败,显然是缺省gcc相关的函数导致

ffmpeg编译_第10张图片

原因是msys版本的pkg-config不能正确读取x265库的依赖库导致,需要手动添加

ffmpeg编译_第11张图片

b) 奇怪的链接错误
ffmpeg编译_第12张图片

c:/mingw/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x34): undefined reference to `_Unwind_SjLj_Register'

c:/mingw/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x87): undefined reference to `_Unwind_SjLj_Unregister'

c:/mingw/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0xb7): undefined reference to `_Unwind_SjLj_Resume'


通过分析查找,发现时上述链接使用的gcc函数库与x265.exe使用的函数库不一致的原因导致。本质原因还是pkg-config不能正确解析x265.pc文件所致,解决方案如下:

ffmpeg编译_第13张图片

c) 正确执行configure配置的结果

ffmpeg编译_第14张图片

可以看到ffmpeg依赖的第三方库已经正确的配置好了libx264libx265

4.编译ffmpeg项目

到这一步基本上大功告成了,只需要执行make && make install即可。

最后可以在目录output下找到编译的结果。

ffmpeg编译_第15张图片

摘自

http://blog.csdn.net/tttyd/article/details/39253281

安装 pkg_config
放到/msys/1.0.bin目录下

1:
FFMPEG 使用#define __STDC_CONSTANT_MACROS





你可能感兴趣的:(FFMPEG/SDL)