编译ffmpeg

windows下编译ffmpeg

环境配置

        MinGW

       全称叫Minimalist GNU for windows,是一套Windows环境下GNU编译组件的接口,通俗的可以说是Win上的gcc。比起MinGW,也许那只企鹅CygWin更加著名一些,但事实上两者是完全不同的东西。CygWinWin上模拟一套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才能运行。我们将MSYSMinGW配合使用就可以打造出一个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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值