视频编解码之windows平台下编译ffmpeg的方法和使用教程
2017-02-20 21:04
1321 查看
1、编译环境的搭建:
在windows平台下编译ffmpeg,通常的方法是采用Mingw+Msys的方法。不过在这里为了方便,也为了以后可以更方便地学习其他的一些知识,我决定安装CodeBlocks这个IDE,其官网在:http://www.codeblocks.org/。在download->binary界面中可以找到该IDE对于各个平台的不同版本,我们要找的是windows平台下集成了Mingw的版本,也就是需要下载安装codeblocks-16.01mingw-setup.exe这个版本。
安装完成之后,出现界面:
接下来安装MSys,[b][b]地址是:[b]http://www.mingw.org/wiki/msys。[/b][/b][/b]
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
检查相关目录,相应的文件已经成功复制过去了。
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已经成功复制。
./configure --prefix=/mingw --enable-expopt=full
make
make install
检查相关目录,/mingw/include下新建了一个lame存放头文件,而/mingw/lib中已经包含了libmp3lame.a、libmp3lame.dll.a、libmp3lame.la三个库文件,说明编译成功。
./configure --prefix=/mingw
make
make install
在目录中新建一个文件名为faac-1.28.diff,内容如下:
[plain] view
plain copy
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
这样编译可以成功。
./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已经成功复制。
configure --prefix=/mingw --enable-w32thread --enable-shared --disable-opencl
make
make install
安装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
1、首先从Github上https://github.com/FFmpeg/FFmpeg下载ffmpeg源码ffmpeg-2.8.2;
2、与编译依赖库类似,进入代码目录,依次执行下列命令:
./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以及可执行程序!
在windows平台下编译ffmpeg,通常的方法是采用Mingw+Msys的方法。不过在这里为了方便,也为了以后可以更方便地学习其他的一些知识,我决定安装CodeBlocks这个IDE,其官网在:http://www.codeblocks.org/。在download->binary界面中可以找到该IDE对于各个平台的不同版本,我们要找的是windows平台下集成了Mingw的版本,也就是需要下载安装codeblocks-16.01mingw-setup.exe这个版本。
安装完成之后,出现界面:
接下来安装MSys,[b][b]地址是:[b]http://www.mingw.org/wiki/msys。[/b][/b][/b]
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,内容如下:
[plain] view
plain copy
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
1、首先从Github上https://github.com/FFmpeg/FFmpeg下载ffmpeg源码ffmpeg-2.8.2;
2、与编译依赖库类似,进入代码目录,依次执行下列命令:
./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以及可执行程序!
相关文章推荐
- FFMPEG教程1_解码后保存图片(使用2014年新SDK重新整理编译通过)
- iOS平台使用ffmpeg解码h264视频流
- cmake工具使用简明教程(基于命令行和gui,编译到windows和linux双平台)
- 在iOS平台使用ffmpeg解码h264视频流
- FFMPEG教程2_解码后在屏幕显示(使用2014年新SDK重新整理编译通过)
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- ffmpeg在Windows平台上的编译方法
- 【视频编解码】Linux下FFmpeg编译安装及其ffplay的安装使用
- windows ffmpeg mingw编译流程及vs中的使用方法(vs2005及其以上可用)
- windows平台下FFMPEG的编译与使用
- windows平台下使用ffmpeg对视频进行H264编码总结
- 在iOS平台使用ffmpeg解码h264视频流
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- FFMPEG教程5_同步视频(使用2014年新SDK重新整理编译通过)
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- iOS平台使用FFmpeg解码H.264视频流
- Android平台上使用SDL官方demo播放视频(使用ffmpeg最新版解码)
- FFMPEG windows平台编译及使用
- 在iOS平台使用ffmpeg解码h264视频流
- 在iOS平台使用ffmpeg解码h264视频流