在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,因为它是开源且免费的。

  • 7-Zip
  • WinRAR

准备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),否则的话请依次执行下面的步骤。

  • 安装MSys
  • 安装MinGW
  • 整合MinGW和MSys

    用SVN方式获取FFmpeg如果你已经知道如何获取FFmpeg的源代码,那么请阅读下一部分编译。 由于FFmpeg的源代码存放在SVN仓库里,你必须使用命令行程序或是图形界面程序来访问。我个人推荐TortoiseSVN,因为它和Windows资源管理器结合的非常棒,所以我只介绍使用TortoiseSVN的方法。 编译

  • 编译静态库
  • 编译动态库

链接

  • 用MSVC++链接DLL库
  • 用MSVC++创建output_example.exe

编译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

 

[Copy to clipboard]

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的缺省includelib路径下,就不需要额外指定这些参数了。如果你希望把动态库和静态库分开保存,那就不得不指定路径。这样的路径被称为你所安装的库的prefix。 如果你把库安装在了非gcc的缺省寻找路径,你必须向FFmpeg的configure脚本传递这些路径信息。

[Copy to clipboard]

CODE:

--extra-ldflags=-L<prefix>/lib --extra-cflags=-I<prefix>/include


类似这样:

[Copy to clipboard]

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。 我将展示下面这些库的安装:

  • zlib
  • mp3lame
  • xvidcore
  • libogg
  • libvorbis
  • faad
  • faac
  • amr_nb
  • amr_wb
  • libdts
  • libgsm
  • x264

引用原文: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.png"

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

 

整合MinGWMSys

复制C:/msys/etc/fstab.sampleC:/msys/etc/fstab

用文本编辑器打开C:/msys/etc/fstab编辑。(注意:使用一个支持Unix换行风格的编辑器)

把下面这行

c:/mingw        /mingw

改为

c:/msys/mingw   /mingw

 

 

编译静态库

    如果你的系统已经按照所安装配置,那么下面的动作将正常执行:

从启动菜单出进入

开始->程序->MinGW->MSys->msys

一个米色背景的窗口会出现在你的眼前,这是一个运行着bashrxvt程序

 

这是一个类Linux的shell并且在Windows上运行的就像是在使用一个真正的Linux shell。

  1. 目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(象"C:/ffmpeg"而不是"C:/ffmpeg")。
  2. 盘符(例如"C:/")可以从根目录处访问(像这样"/C/")。
  3. 文件名或目录名中的空格必须用双引号括起(例如这样"/C/Program Files (x86)",带有双引号)。

切换目录到你之前存放FFmpeg源代码的目录,如果你严格的按照本文的示范,那么就应该输入下面的命令来切换:

cd /C/ffmpeg

 

首先配置FFmpeg,选择你所需要的部分,如果你还想安装额外的库(例如mp3lame,或xvid),参考后面的使用第三方库部分。不过先确保完成了这一部分和下一部分动态库编译。

如果你不知道项包含什么,那么就输入:

./configure --enable-memalign-hack

--enable-memalign-hack选项是在FFmpegWindows上编译成功所必须指定的。

待配置完成后,将回到命令提示符,你应该看到如下的画面:

如果没有错误的话,你现在就可以"make" FFmpeg了,在提示符后输入:

make

编译的过程将持续很长时间。如果一切正常,结束后将返回提示符,并有如下的输出画面

程序已经编译好了,你可以在ffmpeg的目录下找到ffmpeg.exe这个文件。之后,你应该执行安装步骤

make install

得到如下的输出画面:

这将会复制所有生成的重要文件到系统的"Program Files"目录下。通常"Program Files"目录是"C:/Program Files",但也有可能会不同。要了解确切的路径,在提示符下输入:

echo $PROGRAMFILES

然后将Windows风格的路径名改为Linux风格的路径名,进入该目录,在该目录下输入

cd FFmpeg

很好,你现在可以方便的运行ffmpeg.exeFFmpeg已经成功的编译并静态链接了。

当然你得知道正确的参数使用方法,要产生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目录下有三个子目录名字分别为:libavutillibavcodec libavformat。在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,分别是avcodec-51.libavformat-50.lib avutil-49.libMSVC++从这些文件中才能知道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目录下有三个子目录名字分别为:libavutillibavcodec libavformat。在这三个目录下都有一个SLIBNAME_WITH_MAJOR.lib这样的文件,分别是avcodec-51.libavformat-50.lib avutil-49.libMSVC++从这些文件中才能知道dll的导出函数。把这三个文件拷贝到Program Files下的FFmpeg下的lib目录。

现在通过包含include/ffmpeg下的头文件,和使用刚才我们拷贝的那三个lib文件进行链接,就能够编写具备FFmpeg功能的应用程序了。

我提供了一个示例:用MSVC++创建output_example.exe

MSvc++创建output_example.exe


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID...

第1种解说&#xff1a;(核心最后一张图&#xff0c;两种填充方式输出的形状尺寸计算公式)在用tensorflow写CNN的时候&#xff0c;调用卷积核api的时候&#xff0c;会有填padding方式的参数&#xff0c;找到源码中的函数定义如下&#xff08;max pooling也是一样&#xff09;&am…

循环神经网络变形之 (Long Short Term Memory,LSTM)

1、长短期记忆网络LSTM简介 在RNN 计算中&#xff0c;讲到对于传统RNN水平方向进行长时刻序列依赖时可能会出现梯度消失或者梯度爆炸的问题。LSTM 特别适合解决这种需要长时间依赖的问题。 LSTM&#xff08;Long Short Term Memory&#xff0c;长短期记忆网络&#xff09;是R…

UE4 ShooterGame Demo的开火的代码

之前一直没搞懂按下鼠标左键开火之后&#xff0c;代码的逻辑是怎么走的&#xff0c;今天看懂了之前没看懂的部分&#xff0c;进了一步 ShooterCharacter.cpp void AShooterCharacter::OnStartFire() {AShooterPlayerController* MyPC Cast<AShooterPlayerController>(Co…

Windows系统使用minGW+msys 编译ffmpeg 0.5的全过程详述

一.环境配置 1.下载并安装 MinGW-5.1.4.exe (http://jaist.dl.sourceforge.net/sourcef … -5.1.4.exe)&#xff0c;安装时选中 g, mingw make。建议安装到c:/mingw. 2.下载并安装 MSYS-1.0.11-rc-1.exe (http://jaist.dl.sourceforge.net/sourcef … 1-rc-1.exe)&#xff0c;安…

程序员 赚钱

业余编程赚钱 程序员的好方法 现在的人生活水平高了&#xff0c;开销也大了&#xff0c;同时对于一些技术性人员来说有很多种&#xff0c;有些程序员自己开公司&#xff0c;开发自己的产品&#xff0c;年赚百万&#xff0c;有些程序员还在给别人打工&#xff0c;每天累死累活的…

代码 优化 指南 实践

C代码优化方案 华中科技大学计算机学院 姓名&#xff1a; 王全明 QQ&#xff1a; 375288012 Email&#xff1a; quanming1119163.com 目录 目录 C代码优化方案 1、选择合适的算法和数据结构 2、使用尽量小的数据类型 3、减少运算的强度 &#xff08;1&…

.12-浅析webpack源码之NodeWatchFileSystem模块总览

剩下一个watch模块&#xff0c;这个模块比较深&#xff0c;先大概过一下整体涉及内容再分部讲解。 流程图如下&#xff1a; NodeWatchFileSystem const Watchpack require("watchpack");class NodeWatchFileSystem {constructor(inputFileSystem) {this.inputFileSy…

Python 第三方模块之 beautifulsoup(bs4)- 解析 HTML

简单来说&#xff0c;Beautiful Soup是python的一个库&#xff0c;最主要的功能是从网页抓取数据。官方解释如下&#xff1a;官网文档 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱&#xff0c;通过解析文档为用户提供…

modal vue 关闭_Vue弹出框的优雅实践

引言页面引用弹出框组件是经常碰见的需求,如果强行将弹出框组件放入到页面中,虽然功能上奏效但没有实现组件与页面间的解耦,非常不利于后期的维护和功能的扩展.下面举个例子来说明一下这种做法的弊端.click"openModal()">点击 :is_open"is_open" close…

开放平台大抉择

开放平台大抉择之新浪SAE&#xff1a;为个人应用开发带来福音 导读&#xff1a;继上期淘宝网副总裁王文彬从平台功能特色、运营状况等多方面分享了淘宝开放平台的历程和挑战之后。国内另一家云平台服务方的典型代表——Sina App Engine(简称SAE)&#xff0c;作为新浪研发中心于…

HTTP POST 发送数据的参数 application/x-www-form-urlencoded、multipart/form-data、text/plain

HTTP 简介 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。 其中 POST 一般用来向服务端提交数据&#xff0c;本文主要讨论 POST 提交数据的几种方式。 我们知道&#xff0c;HTTP 协议是以 ASCII 码传输&#xff0c;建…

vue 二进制文件的下载(解决乱码和解压报错)

问题描述&#xff1a;项目中使用的是vue框架进行开发&#xff0c;因为文件下载存在权限问题&#xff0c;所以并不能通过 a 链接的 href 属性直接赋值 URL进行下载&#xff0c; &#xff08;如果你的文件没有下载权限&#xff0c;可以直接通过href属性赋值URL的方法进行文件下载…

浅谈云计算与数据中心计算

文/林仕鼎 云计算概念发端于Google和Amazon等超大规模的互联网公司&#xff0c;随着这些公司业务的成功&#xff0c;作为其支撑技术的云计算也得到了业界的高度认可和广泛传播。时至今日&#xff0c;云计算已被普遍认为是IT产业发展的新阶段&#xff0c;从而被赋予了很多产业和…

数据挖掘:如何寻找相关项

导读&#xff1a;随着大数据时代浪潮的到来数据科学家这一新兴职业也越来越受到人们的关注。本文作者Alexandru Nedelcu就将数学挖掘算法与大数据有机的结合起来&#xff0c;并无缝的应用在面临大数据浪潮的网站之中。 数据科学家需要具备专业领域知识并研究相应的算法以分析对…

00030_ArrayList集合

1、数组可以保存多个元素&#xff0c;但在某些情况下无法确定到底要保存多少个元素&#xff0c;此时数组将不再适用&#xff0c;因为数组的长度不可变 2、JDK中提供了一系列特殊的类&#xff0c;这些类可以存储任意类型的元素&#xff0c;并且长度可变&#xff0c;统称为集合 3…

1.3tf的varible\labelencoder

1.tf的varible变量 import tensorflow as tf #定义变量--这里是计数的变量 statetf.Variable(0,namecounter) print (state.name) #输出变量值 onetf.constant(1) #常量new_valuetf.add(state,one) updatetf.assign(state,new_value)#初始化所有变量 inittf.initialize_all_var…

多线程编程指南

1. 多线程编程指南1--线程基础 线程编程指南1--线程基础 Wednesday, 29. March 2006, 11:48:45 多线程 本文出自:BBS水木清华站 作者:Mccartney (coolcat) (2002-01-29 20:25:25) multithreading可以被翻译成多线程控制。与传统的UNIX不同&#xff0c;一个传统 的UNIX进…

路由器和猫的区别

路由器和猫的区别 网络在我们现在生活中必不可少,我们链接互联网经常需要用到猫和路由器,但是依然有很多菜鸟根本不知道什么是猫什么是路由器,至于猫和路由器怎么使用就更不知道了,下面给大家详细的讲解下路由器和猫的区别。 路由器和猫的用途和链接位置不一样,如下图: 路由器:…

kafka 命令行命令大全

kafka 脚本 connect-distributed.sh connect-mirror-maker.sh connect-standalone.sh kafka-acls.sh kafka-broker-api-versions.sh kafka-configs.sh kafka-console-consumer.sh kafka-console-producer.sh kafka-consumer-groups.sh kafka-consumer-perf-test.sh kafka-dele…

python 第三方模块之 APScheduler - 定时任务

介绍 APScheduler的全称是Advanced Python Scheduler。它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务&#xff1a;固定时间间隔&#xff0c;固定时间点&#xff08;日期&#xff09;&#xff0c;Linux 下的 Crontab 命令。同时&#xff0c;它还支持…