文章主要内容介绍
本文主要描述了FFmpeg开发环境的配置。除了FFmpeg依赖的安装和FFmpeg源码的编译的内容,还有如何编译我们自己编写的FFmpeg程序。
如果你需要对基于FFmpeg的小程序进行编译、测试的时候,本文可以帮到你。
本文编译的过程不需要使用那些大型的IDE,你只需要vi或vim即可。
写本文档时的配置环境
FFmpeg版本: 4.1
ysam版本: 1.3.0
zlib版本: 1.2.8
一、安装FFmpeg前准备
1.安装yasm编译器
FFmpeg为了提升效率使用了汇编指令,如MMX和SSE等,所以需要安装汇编编译器yasm。
官网下载:下载地址
手动安装:
tar -xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure
make
make install
2.安装zlib
zlib 适用于数据压缩的函式库,是一个无损数据压缩库。
cd zlib-1.2.8/
./configure
make
make check
make install
注意:
make check进行检查,要全部为OK。
二、编译FFmpeg
不需要安装,之后需要用到FFmpeg的共享库或静态库,所以要先编译。
官网下载:下载地址
手动安装:
cd ffmpeg-4.1/
./configure --enable-shared --prefix=/usr/local/ffmpeg
make
注意:
make用于编译FFmpeg源码,生成库文件,编译花费的时间较多,耐心等待。
./configure用来配置make编译信息和make install程序安装目录等,不能省略。
如果你想要安装FFmpeg,请看文章末尾“参考引用”的第二条。
三、编写Makefile进行FFmpeg程序的编译
1.FFmpeg所需要的开发环境配置项
这里我们先看一下一个基于FFmpeg开发的项目需要配置哪些内容,之后会写一个Makefile的例子。
注: Makefile并不是必要的,比较简单的程序在终端输入gcc语句一步步编译也是可以的,但是使用Makefile能使这个过程变得简单很多。
1.1 配置头文件目录
配置语句:
-I ./ffmpeg头文件所在目录/
1.2 配置库文件目录
如果你需要将程序在其它机器上运行测试,使用链接静态库会比较方便,不过静态库链接相比起采用动态链接库的程序,在体积上通常会更大。
①链接动态库
动态库路径指定:使用-l指定库名称,使用-L指定库的的查找路径。
-l库名称 -L./ffmpeg库所在目录/
②连接静态库
静态库路径指定:使用-static表示优先链接静态库,使用-l指定库名称,使用-L指定库的的查找路径。
配置语句:
-static -l库名称 -L./ffmpeg库所在目录/
2.Makefile示例
按上面配置的思路,将编译语句写入Makefile,方便项目编译。
此Makefile我直接放在 你开发的FFmpeg项目的根目录 下,Makefile文件示例如下:
1.将编译好的FFmpeg源码文件夹复制到项目中。
(放在项目外也没问题,之后会进行文件夹路径的配置;但是如果放在项目外,如果你移动了项目文件,将需要重新配置FFmpeg源码文件夹的路径)
2.新建并编写Makefile文件:vim Makefile
#说明:
#【假设我们要编译的文件是ffmpegTest.c】
#【】
#‘cc’等价与‘gcc’,用于编译链接.c文件
#-static利用静态库编译,如果你需要
#-I指定头文件目录
#-L指定库文件目录
#-l指定库名
#配置头文件目录
INCLUDES = -I./ffmpeg-4.1/
COMPILE_OPTS = ${INCLUDES}
C_FLAGS = ${COMPILE_OPTS} -W -Wall -O3
#配置库目录
LIB_DIR = ./ffmpeg-4.1/
#定义PROGRAM_NAME变量
#用于存储 我们要编译的代码文件的文件名
PROGRAM_NAME= ffmpegTest
#定义其他变量,如果你需要在一个项目中编译多个C/C++文件,这会很有用
#但是本例子中,并没有突出这些变量的作用
#SOURCES保存要编译的代码文件名;
#OBJECTS保存编译出的文件名;
#PROGRAM保存链接出来可执行文件名(即,最终我们要得到的程序)
SOURCES= $(PROGRAM_NAME).c
OBJECTS= $(PROGRAM_NAME).o
PROGRAM= $(PROGRAM_NAME)
all:$(PROGRAM)
#将.c文件编译,生成对应.o对象文件
.c.o:
cc -c ${C_FLAGS} $<
#将.o对象文件和库进行链接,生成程序文件
$(PROGRAM_NAME) :$(PROGRAM_NAME).o
cc -o $@ $< -static -lavformat -L${LIB_DIR}libavformat/
-lavdevice -L${LIB_DIR}libavdevice/
-lavcodec -L${LIB_DIR}libavcodec/
-lavutil -L${LIB_DIR}libavutil/
-lpthread -ldl -lswscale -L${LIB_DIR}libswscale/
-lswresample -L${LIB_DIR}libswresample/
-lz -lm -lrt
#用于清理编译链接生成的文件
clean:
$(RM) $(PROGRAM) $(OBJECTS)
3.进行项目编译
保存Makefile文件之后,到Makefile所在的目录,在终端输入make即可进行编译,此时会输出编译的语句,如果出现错误提示可以进行对应的修改。
有些错误是因为之前编译出的文件有问题,如果出现错误,最好先将上次编译的文件删除,可以使用make clean。
四、可能出现的错误
1.问题:libxxxx/xxxx.h:没有那个文件或目录
出现此问题是因为找不到头文件。
解决方法:
按之前的说明编写,仔细检查。
2.问题:找不到 -lxxxx
出现此问题是因为找不到so库。
解决方法:
按之前的说明,仔细检查。
3.问题:找不到avconfig.h
libavutil/avconfig.h是自动生成的,所以可能FFmpeg源文件夹中会没有这个文件。/* Generated by ffconf */
解决方法:
可能需要对源代码先编译,也可以从其它项目拷贝到libavutil文件夹中。
4.问题:对‘ABC’未定义的引用
出现此问题是因为FFmpeg是C库,在编译为可执行文件时需要具体的实现,这里未正确使用g++造成库无法链接上,也就导致无法找到。
解决方法:
将文件类型改为.c,编译工具改用gcc。
5.问题:找不到lz
出现这个问题就是因为缺少zlib库。
解决方法:
只需要重新安装就可以了。
6.之后的编译错误请补充在此处
需补充错误描述,截图,解决方法。
五、记录注解
1.随着ffmpeg代码版本更新,API接口名称会有更新,可查看ffmpegdoc APIchanges 文件确定名称变更记录;
2.如果程序使用动态库链接,可用ldd查看程序的动态库依赖;
六、参考引用