在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法。
注:
1. 对于compile和build这两个词,本文统一的使用编译这个词,根据上下文读者应能区分语义上的差别。
本文的目的是提供一切与FFmpeg在Windows下的相关帮助。它最初是一个针对用MSys+MinGW系统编译的手把手的教程,现在也增加了如何在你的项目中链接FFmpeg所产生的库(C++,C#)。
我们不讨论Cygwin,因为它的工作方式基本上与Unix系统相一致。 开始之前,首先要明确以下几点:
1. 由于MSVC++并不严格的遵循C标准,因此FFmpeg不能使用MSVC++来编译,而且将来也不会支持。所以整个编译过程必须使用MSys+MinGW系统来完成。
2. 如果你选择编译动态链接库(dll),这些库将和其他的动态链接库一样在使用上没什么差别。你可以使用MSVC++来链接这些库进入到你的程序,只有这种情况下MSVC++是被支持的。
介绍本指南是十分冗长的。如果你已经以前曾有过编译开源软件的经验,你可以尝试读一下这篇。它要简短的多,只需要一些小的微调就能正常工作。
但是如果你遇到了任何问题,在你向ffmpeg的邮件列表报告错误时请先仔细的通读本文,它是非常直观的,不少地方的细节甚至可能过于详细了。我们试图涵盖一切可能出错的地方,如果你精确的遵照文中的方法,你不会在Windows环境下的FFmpeg上有任何问题。 尽你的努力去解决你所遇到的问题,绝大多数的FFmpeg开发人员不使用Windows,所以他们帮不了你什么。
预备这里的内容可能和本文没有什么关系,但是我不想留下任何可能出错的地方。对于绝大多数人来说,这一部分可以跳过。 你需要一个解压的工具软件支持“*.tar.gz”和“*.tar.bz2”文件。你将需要把这些压缩包解压缩到指定的目录下。如果你已经有这样的程序了,并且知道如何解压到特定目录下,请阅读准备MSys+MinGW系统。 这里我将演示如何使用7-Zip或WinRAR来解压缩。推荐使用7-Zip,因为它是开源且免费的。
准备MSys+MinGW系统获取最新的MSys+MinGW系统。注意以下几个包的版本要求:
- 不要使用2.0.4的bash,这个是有缺陷的,2.05b的bash用来编译FFmpeg没有问题,但是更推荐3.1版本。
- 使用msys-1.0.dll-SNAP-1.0.11-2006.04.23
- 不要使用binutils-2.15.91-20040904-1,它无法正确的链接。
如果你已经安装配置完毕,那么请阅读下一部分用SVN方式获取FFmpeg(http://www.aurora-x.net/wiki/CompileFFmpegWindows#FFmpeg_SVN),否则的话请依次执行下面的步骤。
用SVN方式获取FFmpeg如果你已经知道如何获取FFmpeg的源代码,那么请阅读下一部分编译。 由于FFmpeg的源代码存放在SVN仓库里,你必须使用命令行程序或是图形界面程序来访问。我个人推荐TortoiseSVN,因为它和Windows资源管理器结合的非常棒,所以我只介绍使用TortoiseSVN的方法。 编译
链接
编译FFplay你必须事先安装了SDL-devel。
1. 解压该软件包。
2. 将lib下的所有文件复制到C:/msys/mingw/lib。
3. 将include下的所有文件复制到C:/msys/mingw/include。
4. 将bin下的i386-mingw32msvc-sdl-config复制到C:/msys/mingw/bin,并重命名为sdl-config。
5. 将bin下的SDL.dll复制到C:/msys/mingw/bin。
CODE:
SDL.dll必须在ffplay.exe德PATH路径中,程序才能启动。在MSys环境下mingw/bin在PATH环境变量中,因此运行ffplay.exe不会有问题。但如果你想在MSys外部运行,则应SDL.dll复制到和ffplay.exe同一个目录下。
现在你可以按照前面的方式静态或动态重新编译FFmpeg,在运行configure脚本后,它将正确的找到SDL和ffplay。
对第三方库的支持
你必须完全的理解了编译动态库部分。
在向FFmpeg的二进制文件中添加其他的库时,你必须首先考虑库是以静态还是动态的链接到FFmpeg中。不要把这个和FFmpeg本身是静态/动态链接库搞混,你可以把静态的将第三方库链接到FFmpeg中,但是FFmpeg的库本身是动态加载的dll库。
考虑这种情况:你想要更换xvidcore却不希望重新编译FFmpeg,那你就应该把xvidcore编译成动态链接库。
其次你要考虑的是这些第三方库被安装到MSys系统中的什么位置上。
对于绝大多数的是库,如果你把它们安装到缺省路径,你就得向FFmpeg的configure脚本传递额外的参数,这样才能在编译的时候找到这些库。
如果你把这些库安装到gcc的缺省include和lib路径下,就不需要额外指定这些参数了。如果你希望把动态库和静态库分开保存,那就不得不指定路径。这样的路径被称为你所安装的库的prefix。 如果你把库安装在了非gcc的缺省寻找路径,你必须向FFmpeg的configure脚本传递这些路径信息。
CODE:
--extra-ldflags=-L<prefix>/lib --extra-cflags=-I<prefix>/include
类似这样:
CODE:
./configure --enable-memalign-hack --enable-mp3lame -–extra-ldflags=-L/usr/local/lib --extra-cflags=-I/usr/local/include
在MSys下gcc的缺省路径是 /mingw另外,如果你把这些库的dll安装后,确保你的应用程序能在PATH环境变量中找到相应的dll。 我将展示下面这些库的安装:
引用原文:http://www.aurora-x.net/wiki/CompileFFmpegWindows
安装MSys
下载如下的文件:
- MSYS-1.0.11-2004.04.30-1.exe
- msys-1.0.dll-SNAP-1.0.11-2006.04.23.tar.bz2
- bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
接下来依次安装这些文件:
MSYS-1.0.11-2004.04.30-1.exe
运行 MSYS-1.0.11-2004.04.30-1.exe.
点Yes
点Next >
如果你接受许可协议,点Yes
点Next >
选择MSys安装的路径,推荐C:/msys。点Next >。
点Next >
选择MSys在启动菜单中位置,推荐MinGW,点Next >。
点Install。不久你将看到
输入n后回车
再按一下回车。
把所有打勾的框去掉,然后点Finish
msys-1.0.dll-SNAP-1.0.11-2006.04.23.tar.bz2
- 将该压缩包解压到C:/msys/bin。
- 在Windows资源管理器中打开C:/msys/bin目录。
- 删除文件msys-1.0.dll(你刚才已经解压了一个新的版本了,所以删除旧的没有问题)。
- 重命名new-msys-1.0.dll为msys-1.0.dll。
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
- 在本地目录解压该压缩包。
- 产生一个名为bash-3.1的目录。
- 在该目录下有一个子目录名为bin,其他的目录并不关心。
- 复制bin目录中的所有文件到C:/msys/bin。
- 提示是否要覆盖sh.exe的时候,选择确定。
修改 "msys.bat"
用文本编辑器打开C:/msys/msys.bat,譬如记事本等。如果你打算用MSVC++编译你的程序(注意:是你的程序,不是FFmpeg),你需要有.lib文件才能链接到FFmpeg的库。这些.lib文件可以使用微软的工具链中lib命令产生。为此,你的机器上必须已经安装了微软的Visual Studio或是Visual C++。把下面这行加到msys.bat的最前面,把路径替换成你机器上vcvars32.bat实际存在的路径。
call "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/vc7/bin/vcvars32.bat"
如果你的操作系统是Windows x64,那你必须把下面的这些内容插入到:_WindowsNT标签后面(行36):
rem Hopefully a temporary workaround for getting MSYS shell to run on x64
rem (WoW64 cmd prompt sets PROCESSOR_ARCHITECTURE to x86)
if not "x%PROCESSOR_ARCHITECTURE%" == "xAMD64" goto _NotX64
set COMSPEC=%WINDIR%/SysWOW64/cmd.exe
%COMSPEC% /c %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
goto EOF
:_NotX64
安装MinGW
下载这些文件:
- binutils-2.17.50-20060824-1.tar.gz
- gcc-core-3.4.5-20060117-1.tar.gz
- gcc-g++-3.4.5-20060117-1.tar.gz
- mingw-runtime-3.10.tar.gz
- w32api-3.7.tar.gz (站点上找不到该文件,不过这个链接是有效的)
把它们全部解压到C:/msys/mingw。
整合MinGW和MSys
复制C:/msys/etc/fstab.sample为C:/msys/etc/fstab。
用文本编辑器打开C:/msys/etc/fstab编辑。(注意:使用一个支持Unix换行风格的编辑器)
把下面这行
- c:/mingw /mingw
改为
- c:/msys/mingw /mingw
编译静态库
如果你的系统已经按照所安装配置,那么下面的动作将正常执行:
从启动菜单出进入
- 开始->程序->MinGW->MSys->msys
一个米色背景的窗口会出现在你的眼前,这是一个运行着bash的rxvt程序
这是一个类Linux的shell并且在Windows上运行的就像是在使用一个真正的Linux shell。
- 目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(象"C:/ffmpeg"而不是"C:/ffmpeg")。
- 盘符(例如"C:/")可以从根目录处访问(像这样"/C/")。
- 文件名或目录名中的空格必须用双引号括起(例如这样"/C/Program Files (x86)",带有双引号)。
切换目录到你之前存放FFmpeg源代码的目录,如果你严格的按照本文的示范,那么就应该输入下面的命令来切换:
cd /C/ffmpeg
首先配置FFmpeg,选择你所需要的部分,如果你还想安装额外的库(例如mp3lame,或xvid),参考后面的使用第三方库部分。不过先确保完成了这一部分和下一部分动态库编译。
如果你不知道项包含什么,那么就输入:
- ./configure --enable-memalign-hack
--enable-memalign-hack选项是在FFmpeg在Windows上编译成功所必须指定的。
待配置完成后,将回到命令提示符,你应该看到如下的画面:
如果没有错误的话,你现在就可以"make" FFmpeg了,在提示符后输入:
- make
编译的过程将持续很长时间。如果一切正常,结束后将返回提示符,并有如下的输出画面
程序已经编译好了,你可以在ffmpeg的目录下找到ffmpeg.exe这个文件。之后,你应该执行安装步骤
- make install
得到如下的输出画面:
这将会复制所有生成的重要文件到系统的"Program Files"目录下。通常"Program Files"目录是"C:/Program Files",但也有可能会不同。要了解确切的路径,在提示符下输入:
- echo $PROGRAMFILES
然后将Windows风格的路径名改为Linux风格的路径名,进入该目录,在该目录下输入
- cd FFmpeg
很好,你现在可以方便的运行ffmpeg.exe,FFmpeg已经成功的编译并静态链接了。
当然你得知道正确的参数使用方法,要产生Windows兼容的文件请参考http://ffmpeg.mplayerhq.hu/faq.html#SEC9以获取更多的信息。
编译动态库
编译动态库和编译静态库没有什么明显的差别,只不过你要明确地告诉configure脚本你现在将编译动态库。
如果还没有MSys的话,那么现在启动它:
开始->程序->MinGW->MSys->msys
切换到FFmpeg的源代码目录,在开始编译前先清理上一次留下的中间文件是个好习惯:
make distclean
现在需要向configure脚本多传递两个参数:
./configure --enable-shared --disable-static --enable-memalign-hack
后面的则不变:
make
make install
在Program Files下的FFmpeg目录里,现在应该多了一些文件:
ffmpeg.exe
avcodec.dll
avcodec-51.dll
avcodec-51.11.0.dll
avutil.dll
avutil-49.dll
avutil-49.0.0.dll
avformat.dll
avformat-50.dll
avformat-50.5.0.dll
include/
lib/
你可能已经注意到了每个库都有三个对应的dll,它们是同一份文件拷贝。
- SLIBNAME contains only the library name (avcodec.dll)
- SLIBNAME_WITH_MAJOR contains library name and major version number (avcodec-51.dll)
- SLIBNAME_WITH_VERSION contains library name and full version number (avcodec-51.11.0.dll)
因为MSys将ln(制作符号链接的程序)以cp(文件复制)来对待,所以就产生了这些相同的拷贝。
除了消耗点磁盘外不会有任何其他问题,不过对于所有使用这些库的可执行文件来说只链接到SLIBNAME_WITH_MAJOR,因此你可以放心的删除另外两个。换句话说你只需留下avcodec-51.dll、avformat-50.dll 和 avutil-49.dll就行了。
include目录包含了一个名为ffmpeg的子目录,这个子目录里存放了所有其他应用程序访问FFmpeg库时所需包含的头文件。
lib目录下有一个子目录pkgconfig。如果你不知道它是干吗的,那就忽略它吧。
用MSVC++链接DLL库
这是绝大多数人发生误解的地方:FFmpeg SVN本身不能用MSVC++编译,但是如果它在MinGW下正确的被编译,那么你可以把生成的dll用在任何支持dll的程序里。
注意你将用到的不是ffmpeg.exe,而是那些dll。
在开始往下阅读之前,你应该确保你完成并理解了编译静态库和编译动态库部分的内容。这不是推荐的,而是必须的。
在msys提示符下输入:
- lib
如果你看到如下的画面,说明一切OK,注意有Microsoft (R) Library Manager字样。
上面假定了你是在完成了编译动态库后在FFmpeg目录下执行的,如果你还没有编译动态库,那么依次执行如下:
- cd /c/ffmpeg
- make distclean
- ./configure --enable-shared --disable-static --enable-memalign-hack
- make
- make install
- lib
在ffmpeg目录下有三个子目录名字分别为:libavutil、libavcodec 和 libavformat。在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,分别是avcodec-51.lib、avformat-50.lib 和avutil-49.lib。MSVC++从这些文件中才能知道dll的导出函数。把这三个文件拷贝到Program Files下的FFmpeg下的lib目录。
现在通过包含include/ffmpeg下的头文件,和使用刚才我们拷贝的那三个lib文件进行链接,就能够编写具备FFmpeg功能的应用程序了。
我提供了一个示例:用MSVC++创建output_example.exe
用MSvc++创建output_example.ex
这是绝大多数人发生误解的地方:FFmpeg SVN本身不能用MSVC++编译,但是如果它在MinGW下正确的被编译,那么你可以把生成的dll用在任何支持dll的程序里。
注意你将用到的不是ffmpeg.exe,而是那些dll。
在开始往下阅读之前,你应该确保你完成并理解了编译静态库和编译动态库部分的内容。这不是推荐的,而是必须的。
在msys提示符下输入:
- lib
如果你看到如下的画面,说明一切OK,注意有Microsoft (R) Library Manager字样。
上面假定了你是在完成了编译动态库后在FFmpeg目录下执行的,如果你还没有编译动态库,那么依次执行如下:
- cd /c/ffmpeg
- make distclean
- ./configure --enable-shared --disable-static --enable-memalign-hack
- make
- make install
- lib
在ffmpeg目录下有三个子目录名字分别为:libavutil、libavcodec 和 libavformat。在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,分别是avcodec-51.lib、avformat-50.lib 和avutil-49.lib。MSVC++从这些文件中才能知道dll的导出函数。把这三个文件拷贝到Program Files下的FFmpeg下的lib目录。
现在通过包含include/ffmpeg下的头文件,和使用刚才我们拷贝的那三个lib文件进行链接,就能够编写具备FFmpeg功能的应用程序了。
我提供了一个示例:用MSVC++创建output_example.exe
用MSvc++创建output_example.exe
在Windows下编译ffmpeg完全手册的更多相关文章
- [转]在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...
- 在Windows下编译FFmpeg详细说明
MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...
- ffmpeg windows下编译ffmpeg
windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...
- windows下编译ffmpeg
windows 编译ffmpeg 搞过很多次,每次总是磕磕碰碰,从头到尾不能一直顺利,浪费一些时间.终究起原因,都是当时记得,过段时间就忘了.好记性不如烂笔头,大好周末晚上,闲暇无事,记录最近一次编译 ...
- 在windows下编译ffmpeg
编译ffmpeg,我在网上找了很多相关的方法,但最后都没编译成功. 所以下面就记录下自己的编译方法吧,留着以后编译的时候做参考. 1.首先,下载编译工具MinGW+Msys,搭建编译环境.工具下载地址 ...
- Windows下编译安装 FFmpeg
在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...
- 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- windows 下编译64位ffmpeg
window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...
- windows下编译php7图形库php_ui.dll
CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...
随机推荐
- gdb基本使用方法
gdb时linux下的一个非常好用的调试工具.下面给出它几个常用的方法 b 设置断点.c 继续执行. i 查看一些信息,比如断点,i b. bt 查看函数调用栈. n 执行下一条指令,但不会进入到调用 ...
- POJ 3126 Prime Path(BFS求“最短路”)
题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...
- Winform基础 -- 菜单
快速创建默认菜单 使用控件 MenuStrip : 点击菜单的右上方小三角:选择 [插入标准项] 即可显现出标准的菜单格式: 如果想添加更多的菜单项,可以在 [请在此处键入] 处输入菜单项的名称 ...
- Android Drawable 关于selector中state_pressed="true"的位置顺序
界面中有一个按钮使用这样的样式: <?xml version="1.0" encoding="utf-8"?> <selector xmlns ...
- 解决 Ubuntu 开机 Waiting for 60 seconds more for network configuration
sudo vim /etc/network/interfaces, 将该文件的内容修改为如下:(也就是说删掉其他的什么auto eth0.auto wlan0) auto lo iface lo in ...
- hadoop 2.2.0的datanode中存储block的多个文件夹的负载均衡问题
hadoop的分布式文件系统HDFS的存储方式是,将数据分成block,分布式存储在整个hadoop集群的datanode中,每个block默认的大小是64M,这些block文件的具体存储位置是在ha ...
- Hibernate逍遥游记-第12章 映射值类型集合-003映射List(<list-index>)
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- ISO9001、ISO14001、OHSAS18000什么意思
ISO9001是ISO9000族标准所包括的一组质量管理体系核心标准之一.ISO9000族标准是国际标准化组织(ISO)在1994年提出的概念,是指“由ISO/TC176(国际标准化组织质量管理和质量 ...
- NPOI操作EXCEL----------NPOI基础01
来源地址:http://www.cnblogs.com/csqb-511612371/p/4878059.html 先来介绍一下NPOI基本的东西: 1.下载地址:http://npoi.codepl ...
- C# 常用对象的的修饰符
class(类) 1.internal 表示类只能在当然程序集中访问,类默认修饰符 2.public 表示所有地方都可以访问,与internal是互斥的 3.abstract 抽象类,不能被实例化,只 ...