FFMPEG在Windows平台编译的傻瓜教程

简介: 在开始这篇博文之前,我心里一直忐忑不安七上八下。因为从最初的安装编译环境开始一直到最终编译完成,这整个工程堪称规模宏大,而且路途中陷阱重重,稍不注意就有可能前功尽弃。

在开始这篇博文之前,我心里一直忐忑不安七上八下。因为从最初的安装编译环境开始一直到最终编译完成,这整个工程堪称规模宏大,而且路途中陷阱重重,稍不注意就有可能前功尽弃。在将从前编译出的库删掉之后,我心里甚至有些许怀疑自己还能不能再次成功编译出来。不过既然走到了这一步,就是爬,也得爬到终点!闲话到此,开始进入正题。

1、编译环境的搭建:

在开始之前,首先确定当前系统没有安装过mingw。方法是打开cmd命令行,键入mingw32-make.exe,回车。系统应该显示无法识别命令,这就说明当前系统是“干净”的,可以继续下面的安装步骤。

在windows平台下编译ffmpeg,通常的方法是采用Mingw+Msys的方法。不过在这里为了方便,也为了以后可以更方便地学习其他的一些知识,我决定安装CodeBlocks这个IDE,其官网在:http://www.codeblocks.org/。在download->binary界面中可以找到该IDE对于各个平台的不同版本,我们要找的是windows平台下集成了Mingw的版本,也就是需要下载安装codeblocks-13.12mingw-setup.exe或者codeblocks-13.12mingw-setup-TDM-GCC-481.exe这两个版本中的一个。



安装过程就不用多解释了,基本上一路next就可以。只是需要注意最好将其安装在某磁盘分区根目录下,如我们将安装位置定位D:\CodeBlocks。



接下来便是开始安装了。在安装快结束的时候会出现编译器自动检测,选择默认的GNU GCC Compiler即可。安装完成后,便出现了CodeBlocks的启动界面,如下图所示。看惯了Visual Studio还有Xcode绚丽却又复杂的界面后,感觉CodeBlocks的简洁清新却又是别有一番风味。



安装完成后,打开安装目录就可以看到codeblocks根目录下已经有了mingw文件夹,说明我们已经安装完成。下一步需要配置系统环境变量,将mingw的目录添加到其中。具体方法是打开“控制面板\系统和安全\系统”,选择“高级系统设置”,选择“环境变量”,在“系统变量”中添加下面两行路径:

D:\CodeBlocks\MinGW\bin;

D:\CodeBlocks\MinGW\libexec\gcc\mingw32\4.8.1;

完成后,我们将Path环境变量中的值拷贝出来,下面就是当前系统中定义的一些环境变量值:



至此,Codeblocks和Mingw就已经安装完成。

接下来安装MSys,地址是:http://www.mingw.org/wiki/msys。下载完成后一路默认安装即可。安装结束时会有一个post install步骤,如下图所示。


选择Y,enter。随后询问是否安装了Mingw,依然选择Y,enter。随后MSys会要求你输入Mingw的安装路径,输入d:/CodeBlocks/MinGW(注意斜杠的方向)。完成后找到msys.bat文件,用记事本打开并在开头添加以下脚本:

  1. call  "D:\Visual Studio 2010 Ultimate\VC\vcvarsall.bat"  
这里的路径是本机安装VS2010的路径,各人可能有所不同。保存之后,编译环境就宣告安装配置完成了。


2、编译FFMPEG的依赖库

想要成功编译出ffmpeg,需要提前安装的依赖库非常非常多,而且有些还非常复杂。现在我们开始一个个尝试编译安装。

(1)安装yasm。

从这个链接下载:http://yasm.tortall.net/Download.html;选择其中的win32类别的,下载完成后文件名为:yasm-1.2.0-win32.exe。将这个文件重命名为yasm.exe并拷贝到C:\Windows\system32或者D:\Mingw\Bin中。

(2)编译zlib。

zlib是用于数据压缩的一个开源库,地址是:http://www.zlib.net/。我们将源文件zlib-1.2.8.tar下载成功后拷贝到D:\MSYS1.0\home\Administrator中并解压缩。随后进入msys,依次输入以下命令:

cd zlib-1.2.8

make -f win32/Makefile.gcc

编译完成后,在zlib-1.2.8生成了zlib1.dll、libz.a文件。然后调用以下命令将相关文件复制到Mingw响应的目录:

cp -iv zlib1.dll /mingw/bin  

cp -iv zconf.h zlib.h /mingw/include  

cp -iv libz.a /mingw/lib  

检查相关目录,相应的文件已经成功复制过去了。

(3)编译libgsm。

下载地址是:http://libgsm.sourcearchive.com/。下载完成的文件为libgsm_1.0.13.orig.tar,将其拷贝到D:\MSYS1.0\home\Administrator并解压。在msys中进入gms目录后,输入以下命令:

make(这一步会出现fchmod和fchown的编译错误,无视之,因为我们只需要libgsm.a库文件即可)

mkdir /mingw/include/gsm

cp inc/gsm.h /mingw/include/gsm

cp lib/libgsm.a /mingw/lib

同样,检查相关目录,头文件gsm.h和库文件libgsm.a已经成功复制。

(4)编译lame。

下载地址:http://sourceforge.net/projects/lame/files/lame/。将压缩包在与上面几个库相同的位置解压,msys进入后执行:

./configure --prefix=/mingw --enable-expopt=full

make

make install

检查相关目录,/mingw/include下新建了一个lame存放头文件,而/mingw/lib中已经包含了libmp3lame.a、libmp3lame.dll.a、libmp3lame.la三个库文件,说明编译成功。

(5)编译Libogg、Libvorbis、Libspeex和Libtheora

下载地址为http://xiph.org/downloads/。安装方法同上面类似,即解压,在msys中执行

./configure --prefix=/mingw

make

make install

(6)编译faac

faac主要用于音频的编解码,下载地址http://www.audiocoding.com/downloads.html。将faac-1.28.tar解压。随后需要对文件进行一些小修改:

在目录中新建一个文件名为faac-1.28.diff,内容如下:

diff -ur faac-1.28.orig/common/mp4v2/mpeg4ip_win32.h faac-1.28/common/mp4v2/mpeg4ip_win32.h
--- faac-1.28.orig/common/mp4v2/mpeg4ip_win32.h	Sun Jan 25 10:14:34 2009
+++ faac-1.28/common/mp4v2/mpeg4ip_win32.h	Sat Jul 10 18:32:45 2010
@@ -42,10 +42,18 @@
 #include <stdlib.h>
 #include <time.h>
 #include <limits.h>
+#include <ctype.h>
 
 #ifndef inline
 #define inline __inline
 #endif
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+typedef uint64_t u_int64_t;
+typedef uint32_t u_int32_t;
+typedef uint16_t u_int16_t;
+typedef uint8_t u_int8_t;
+#else
 typedef unsigned __int64 uint64_t;
 typedef unsigned __int32 uint32_t;
 typedef unsigned __int16 uint16_t;
@@ -58,10 +66,12 @@
 typedef signed __int32 int32_t;
 typedef signed __int16 int16_t;
 typedef signed __int8  int8_t;
+#endif
 typedef unsigned short in_port_t;
 typedef int socklen_t;
-typedef int ssize_t;
+/*typedef int ssize_t;*/
 typedef unsigned int uint;
+/*
 static inline int snprintf(char *buffer, size_t count,
 			  const char *format, ...) {
   va_list ap;
@@ -75,11 +85,14 @@
   }
   return ret;
 }
+*/
 #define strncasecmp _strnicmp
 #define strcasecmp _stricmp
 #define localtime_r(a,b) localtime_s(b,a)
+/*
 #define printf printf_s
 #define fprintf fprintf_s
+*/
 
 #include <io.h>
 #include <fcntl.h>
@@ -124,8 +137,13 @@
 #define U64F  "I64u"
 #define X64F "I64x"
 
+#if defined(__WINDOWS__) && !defined(__MINGW32__)
 #define TO_D64(a) (a##I64)
 #define TO_U64(a) (a##UI64)
+#else
+#define TO_D64(a) (a##LL)
+#define TO_U64(a) (a##ULL)
+#endif
 
 #define LOG_EMERG 0
 #define LOG_ALERT 1
diff -ur faac-1.28.orig/frontend/Makefile.am faac-1.28/frontend/Makefile.am
--- faac-1.28.orig/frontend/Makefile.am	Tue Dec 16 09:56:00 2008
+++ faac-1.28/frontend/Makefile.am	Sat Jul 10 18:00:49 2010
@@ -5,7 +5,7 @@
 
 if WITH_MP4V2
 INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/common/mp4v2
-LDADD = $(top_builddir)/libfaac/libfaac.la $(top_srcdir)/common/mp4v2/libmp4v2.a -lm -lstdc++
+LDADD = $(top_builddir)/libfaac/libfaac.la $(top_srcdir)/common/mp4v2/libmp4v2.a -lm -lstdc++ -lws2_32
 else
 INCLUDES = -I$(top_srcdir)/include 
 LDADD = $(top_builddir)/libfaac/libfaac.la -lm

然后执行:

patch -p1 < faac-1.28.dll

./bootstrap

./configure --prefix=/mingw

make

make install

这样编译可以成功。

(7)编译xvidcore-1.3.2

下载地址:http://www.xvid.org/。解压,进入\xvidcore\build\generic目录,执行

./configure --prefix=/mingw

随后,需要将该目录下的几个文件(config/config.status/configure/configure.in)中含有的“-mno-cygwin”字符删掉,否则会出现编译错误。

然后执行

make

make install

cp -iv \=build/xvidcore.dll.a /mingw/lib/libxvidcore.dll.a

检查目标文件,libxvidcore.dll.a已经成功复制。

(8)安装X264

下载地址http://www.videolan.org/developers/x264.html。与上面的库类似,解压,进入目录,执行下列命令“

configure --prefix=/mingw --enable-w32thread --enable-shared --disable-opencl

make

make install

(9)安装SDL

SDL是可以选装的部分,如果不安装SDL,我们依然可以生成ffmpeg.exe和ffprob.exe,但是不能生成ffplay.exe。

安装SDL的过程比较简单,从http://www.libsdl.org/download-1.2.php下载SDL-devel-1.2.15-mingw32.tar。解压后,需要将makefile做一些小修改,将CROSS_PATH路径改为CROSS_PATH := /mingw。在msys命令行中执行:

 make cross

结束后,在mingw的include目录分别生成了SDL目录存放头文件,在lib目录存放库文件。

3、编译ffmpeg

ffmpeg的代码从github下载:https://github.com/FFmpeg/FFmpeg

与编译依赖库类似,进入代码目录,依次执行下列命令:

./configure --prefix=/mingw --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-postproc --enable-avfilter --enable-runtime-cpudetect --enable-memalign-hack --enable-bzlib --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --disable-debug --enable-pthreads

但是系统会提示pr: command not found。我们需要在http://code.google.com/p/mingw-lib/downloads/detail?name=coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2&can=2&q=下 coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2这个文件,并将bin目录下的pr.exe复制到/msys1.0/bin目录下。

系统提示找不到libxvid,所以暂时把"--enable-libxvid"去掉,重新configure,成功。

下面执行:

make

make install

执行成功,在/mingw/bin文件夹下我们成功看到了编译出来的dll以及可执行程序!


再次尝试libxvid。从msys/local/include中将xvid.h复制到mingw/include中,在configure命令中加上--enable-libxvid,再次configure,现在发现成功了。执行make/make install也一切正常。


4、后记

经过了旷日持久的研究和调试,终于成功地将ffmpeg库编译出来。但是事情到此并没有彻底结束,依然存在着一个问题没弄明白。在第一次尝试编译的时候,我所使用的是codeblocks-13.12mingw-setup-TDM-GCC-481.exe这个IDE,但是在最后make ffmpeg的时候,在libavutil/time.c这个文件的编译过程中总是出现错误,提示“Storage size of  'ts' isn't known”(如下图)。到现在仍然不知道这是因为什么引起的。在今天换用了codeblocks-13.12mingw-setup.exe之后便可以正常编译通过了。这究竟是什么问题呢?这两个IDE的版本究竟有多大区别?由于对这部分知识不熟悉,现在这些问题仍然像未解之谜一样难以得知,仍待以后继续学习。


目录
相关文章
|
2月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
326 4
|
2月前
|
NoSQL Redis 数据安全/隐私保护
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
文章提供了Redis最流行的图形化界面工具Another Redis Desktop Manager的下载及使用教程,包括如何下载、解压、连接Redis服务器以及使用控制台和查看数据类型详细信息。
192 6
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
|
2月前
|
存储 弹性计算 运维
阿里云国际Windows操作系统迁移教程
阿里云国际Windows操作系统迁移教程
|
2月前
|
NoSQL Redis 数据库
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
文章提供了Redis图形化界面工具的下载及使用教程,包括如何连接本地Redis服务器、操作键值对、查看日志和使用命令行等功能。
191 0
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
|
1月前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
88 4
|
2月前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
93 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
2月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
216 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
2月前
|
存储 NoSQL MongoDB
MongoDB入门级别教程全(Windows版,保姆级教程)
一份全面的MongoDB入门级教程,包括在Windows系统上安装MongoDB、使用MongoDB Shell和Compass GUI进行数据库操作,以及MongoDB的基本数据类型和查询技巧。
100 2
MongoDB入门级别教程全(Windows版,保姆级教程)
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
67 0
Windows 平台安装 MongoDB