windows下编译ffmpeg
环境配置
MinGW
全称叫Minimalist GNU for windows,是一套Windows环境下GNU编译组件的接口,通俗的可以说是Win上的gcc。比起MinGW,也许那只企鹅CygWin更加著名一些,但事实上两者是完全不同的东西。CygWin在Win上模拟一套Linux环境,使用Win的存储系统,编译的却是Linux环境下的程序,和虚拟机比较相似;MinGW则是完全的编译出Windows环境下的程序,换句话说,通过MinGW编译出来的exe是可以直接在explorer下双击运行的。从移植的角度上说,使用MinGW才能真正将一个Linux程序移植到Win,而CygWin不能。
MSYS
全称叫Minimal SYStem,是一套运行在Windows上的bash,也就是运行在Win上的Linux Terminal 。这个比较好理解,其实就是在Win上使用Linux的命令行进行操作,可以代替cmd来使用,通过手工修改安装目录下的etc/fstab来定位MinGW的目录。对一些GNU的开源软件,MSYS可能是必需的,因为它们通常需要./configure然后make才能运行。我们将MSYS和MinGW配合使用就可以打造出一个Win下的GNU命令行终端和编译系统。
mingw的下载地址为:MinGW - Minimalist GNU for Windows download | SourceForge.net,如mingw-get-setup.exe(版本为0.6.2-beta-2013.1004-1),双击运行,"MingGW Installation Manager"界面出现后,选"Basic Setup",将右侧的选项全部选中,再点菜单“Installation”下的“Apply Changes”,到此开始装置文件,等安装完成后,到MingGW/msys/1.0/etc目录,直接复制fstab.sample出另一个文件fstab,打开到最后几行,在“/mingw”前写入mingw的安装路径,如"d:/mingw",这样目的是为msys指定mingw。
ffmpeg编译
ffmpeg依赖如下库,要先安装,
zlib 以zlib读写Matroska等以DEFLATE算法压缩的多媒体串流格式。
libiconv 库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。
到ffmpeg官网下载最新的源码,拷贝到C:\msys\1.0下。
双击msys.exe,输入lib.exe(此程序在VC的安装目录下,功能为把x.def文件解释称x.lib文件),link.exe,如果提示找不到,需要指定lib.exe跟link.exe及其依赖库的路径,如:export PATH=":C:\Program Files\Microsoft Visual Studio 8\VC\bin:$PATH"。接着按如下三步编译:
1 cd ./ff
./configure --enable-shared --disable-static --enable-memalign-hack --prefix=/usr/local/ffmpeg
一些参数的说明,
./configure --help(先看看你想要配置啥的),
enable-memalign-hack 是指编译时,使用内存对齐方式,这样以便编译时用mmx或者sse指令对代码进行优化。
disable-debug 禁用调试符号。
--enable-gpl allow use of GPL code, the resulting libs,and binaries will be under GPL [no]
--enable-version3 upgrade (L)GPL to version 3 [no]
--enable-nonfree allow use of nonfree code, the resulting libs, and binaries will be unredistributable [no]
--disable-doc do not build documentation
--disable-yasm 如果没有yasm,可以去掉,
extra-cflags=-I /(依赖的头文件所在文件夹),
extra-ldflags=-L/(依赖的库文件所在文件夹),
--cpu=i686 得写上,要不会提示:Threading is enabled, but there is no implementation of atomic operations available,
--prefix = 你想安装到哪里,例如:--prefix=/usr/local,
不加--enable-w32threads开关时,出现如下错误:
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/
pthread.h:288:0,
from libavcodec/pthread.c:32:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sched.h:152:53: error:
expected ')' before 'pid'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sched.h:154:53: error:
expected ')' before 'pid'
make: *** [libavcodec/pthread.o] Error 1
增加开关: --enable-w32threads,弃用pthread, 采用windows native thread, 问题消失(原因,可能安装MinGW时pthread包没有下好,下次重试看看。)
如果MinGW/msys没有安装pkg-config, configure 会抱错,但是不影响make。 解决的办法是下载pkg-config for MinGW/msys.
2 make
3 make install
到此编译完成,在local有生成的头文件,库。
遇到的问题
不生成LIB文件
第一步:发现生成了DLL,没有生成LIB,并有如下提示:“$ lib.exe /machine:i386 /def:libavformat/avformat-52.def /out:libavformat/avformat-52.lib
make: lib.exe:Command not found”。
很明显找不到"lib.exe"(此程序用来转def成lib),看来执行call ".../vcvars32.bat"并没有加载所需的路径(??),去VC安装目录下找“lib.exe”跟依赖的库“mspdb80.dll”,将这两个库,拷贝到“msys\1.0\bin”,在mingw命令行上输入“lib.exe”,发现已经不是“...Command not found”的提示了,说明已经能找到"lib.exe"了。
第二步:先试下“lib.exe”能不能用,执行“lib.exe /machine:i386 /def:libavformat/avformat-52.def /out:libavformat/avformat-52.lib”,发现有如下提示:“LINK: extra operand '/def:libavformat/avformat-52.def' TRY 'LINK --help' for more information”。可以看出是link.exe有问题,mingw下的link.exe支持并不是很完善,会导致编译失败或者有问题,因此从VC下找到“link.exe”并替换mingw下的(先备份),再执行刚才的命令,无错误提示。
第三步:用"lib.exe"一个一个生产lib太麻烦,直接依次执行:"make clean","make && make install",发现已经生成了lib文件。
运行ffmpeg.exe提示“丢失libiconv-2.dll”
解决方法:
去“http://www.gnu.org/software/libiconv/”下载库“libiconv-1.14.tar.gz”,放到home/dell下,解压,mingw命令行进入,依次执行“./configure make make install”即可。
不生成ffplay.exe的问题
解决方法:
如果不安装SDL的话,就不会生产ffmpeg.exe。SDL的编译参见:的这样configure之后,"config.mak"会含有“HAVE_SDL=yes”,否则,如何找不到SDL的信息,就会含有“HAVE_SDL=no”,此后编译生成ffplay.exe。
linux下编译ffmpeg
# 安装yasm
此为汇编器,执行:yum install -y yasm
或者如下方法:
下载目录:
http://www.tortall.net/projects/yasm/releases
从该目录下可以找到合适平台的合适版本。
命令安装:
# wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
# tar zxvf yasm-1.3.0.tar.gz
# cd yasm-1.3.0
# ./configure
# make && make install
#安装openssl
以openssl-1.0.2k.tar.gz为例。
./config --prefix=/usr/local/openssl
make && make install
./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
make clean
make && make install
#安装libx265
一 获取libx265源码
1 去libx265官网上下载源码,地址:http://ftp.videolan.org/pub/videolan/x265/
2 将源码放入linux目录下,注意,若是虚拟机的话要放到Linux系统的真实目录下,而不是windows的共享文件夹,否则会有很多问题。
二 编译libx265源码
libx265是用CMAKE编译的,故先下cmake,我是centos系统,命令:
yum install cmake -y
进入目录./x265_1.9/build/linux/下,执行脚本:
sh make-Makefiles.bash
选择好之后(如输出路径),输入g退出.
此时在source目录下生成了makefile脚本,你只要执行以下make,库便在当前目录下生成了。执行make install安装x265。
# 安装libx264
下载源码,解压,执行:
./configure --enable-shared --prefix=/usr/local
//需要赋予各个shell的权限。
make
make install
# 安装zlib
$cd zlib-1.2.3.tar.gz
$./configure
$make
$make install
#支持mp3
lame的获取地址如下: LAME MP3 Encoder
配置编译
for x86
./configure --enable-shared --prefix=/usr/local
#FAAD2的编译
cd faad2
autoreconf -vif
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
# 安装facc
find / -name "*aac*"
下载源码,解压,执行
./configure --enable-shared
make
make install
# 安装fdk_aac
git clone git://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -i //可能要求装libtool,aotomake。
./configure
make
make install
编译命令:--enable-libfdk-aac
执行: ./configure --enable-shared --disable-static --enable-memalign-hack --enable-ffplay --enable-libx264 --enable-gpl --enable-libfaac --enable-nonfree
寻找x264库,其他命令,--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib就是你x264库的路径。
支持NVIDIA
gcc要在4.8以上,CUDA toolkit必须安装。
执行:make
执行:make install
遇到的问题
编译faac-1.28,在make时会有一个错误,mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’
解决办法:
从123行开始修改此文件mpeg4ip.h,到129行结束。
修改前:
#ifdef __cplusplus
extern "C" {
#endif
char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
修改后:
#ifdef __cplusplus
extern "C++" {
#endif
const char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
不能断点调试
加上--enable-debug --disable-yasm --disable-optimizations --disable-asm --disable-stripping
strip命令就会去掉FFMPEG的symbols(符号表),这就相当于--disable-debug这个默认选项install了
ERROR: x265 not found using pkg-config
原因是pkg-config找不到
[root@localhost ffmpeg-3.1.1]# pkg-config --modversion x265
Package x265 was not found in the pkg-config search path.
Perhaps you should add the directory containing `x265.pc'
to the PKG_CONFIG_PATH environment variable
No package 'x265' found
解决办法是改变PKG_CONFIG_PATH:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
GPU不能转码
具体提示是:Cannot load libnvcuvid.so.1[h264_cuvid @ 0x24d73c0] Failed loading nvcuvid.
此问题一般是依赖库没装好,重装cuda,发现有些缺少库提示,如下:
Installing the NVIDIA display driver...
Installing the CUDA Toolkit in /usr/local/cuda-9.0 ...
Missing recommended library: libGLU.so
Missing recommended library: libX11.so
Missing recommended library: libXi.so
Missing recommended library: libXmu.so
解决办法:这是都是下显示库,按yum list libX*找到安装包,然后安装,其他类似,即:
yum install mesa-libGL-devel.x86_64 mesa-libGLU-devel.x86_64
yum install libX11.x86_64 libX11-devel.x86_64
yum install libXinerama-devel.x86_64
yum install libXmu.x86_64 libXmu-devel.x86_64