一个视频直播的项目,需要使用嵌入式Linux设备作为一个推流端,所以使用FFmpeg实现推流功能。
libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264。ffmpeg 中带有264的解码,没有编码,需要添加x264。
fdk_aac被许多人认为几乎是最好的aac编码器,音质顺序大概为libfdk_aac>libfaac>aac>libvo_aacenc。
librtmp用来接收、发布RTMP协议格式的数据。FFmpeg支持RTMP协议,将librtmp编译进去后支持协议RTMPE、RMTPTE、RTMPS。这里我直接使用FFmpeg自带的RTMP功能。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
下载地址:http://www.videolan.org/developers/x264.html 。我所使用版本为x264-snapshot-20171109-2245。
使用下面的命令进行下载:
$ wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
下载地址:http://ffmpeg.org 。我所使用版本为ffmpeg-3.4。
配置
./configure --prefix=/home/horo/arm/software/x264_arm --enable-static --host=arm-none-linux-gnueabi --cross-prefix=arm-none-linux-gnueabi- --disable-asm
之前配置arm-linux-gcc时没有编译通过,配置为arm-none-linux-gnueabi时编译通过。
编译
执行make命令进行编译。
$ make
编译过程中报错:
libx264.a(set.o):在函数‘x264_sps_init’中:
set.c:(.text+0xa10):对‘log2f’未定义的引用
libx264.a(encoder.o):在函数‘x264_validate_parameters’中:
encoder.c:(.text+0x2990):对‘log2f’未定义的引用
修改common/osdep.h文件,删除log2和log2f函数定义的条件判断部分,再次进行编译后,编译通过。
//#if !HAVE_LOG2F
#define log2f(x) (logf(x)/0.693147180559945f)
#define log2(x) (log(x)/0.693147180559945)
//#endif
安装
执行make install命令安装到指定目录。
$ make install
将安装目录下的bin/、include/、lib/下所需要文件拷贝到开发板根目录下的对应位置。
配置
运行autogen.sh生成configure文件,报错:
./autogen.sh: 2: ./autogen.sh: autoreconf: not found
原因是没有安装automake工具,使用命令进行安装:
$ sudo apt-get install autoconf automake libtool
配置configure,生成Makefile。
./configure --prefix=/home/horo/arm/software/fdkaac_arm --host=arm-none-linux-gnueabi --disable-shared
编译
执行make命令进行编译。
$ make
安装
执行make install命令安装到指定目录。
$ make install
将安装目录下的include/、lib/下所需要文件拷贝到开发板根目录下的对应位置。
配置
./configure --prefix=/home/horo/arm/software/ffmpeg_arm --enable-cross-compile --cross-prefix=arm-none-linux-gnueabi- \
--arch=armel --target-os=linux --enable-gpl --enable-nonfree --extra-cflags="-I/home/horo/arm/software/fdkaac_arm/include \
-I/home/horo/arm/software/x264_arm/include -I/home/horo/arm/software/sdl2_arm/include/SDL2" \
--extra-ldflags="-L/home/horo/arm/software/fdkaac_arm/lib -L/home/horo/arm/software/x264_arm/lib \
-L/home/horo/arm/software/sdl2_arm/lib" --enable-libfdk-aac --enable-libx264 --pkg-config-flags=--static \
--extra-libs="-ldl -fpic -shared -lSDL2" --enable-shared
配置完成后会有一些警告信息:
警告4.2.1的编译器过时,进行编译时找不到perf_event文件,后修改为使用4.5.1的编译器。
将编译生成的x264.pc和fdk-aac.pc文件复制到usr/local/lib/pkgconfig/文件夹下。
把/usr/bin/pkg-config复制到arm-none-linux-gnueabi-gcc的同一个目录,并改名为arm-none-linux-gnueabi-pkg-config。这么做的原因是ffmpeg在configure的时候,一定需要找到x265的x265.pc文件,而x264的没有的话,通过指定lib目录和头文件就可以了。
编译
执行make命令进行编译。
$ make
编译过程中报错:
网上查资料没有找到解决办法,最后我把libavutil/timer.h中的AV_READ_TIME定义为read_time。以后再在实际使用中检查有什么影响。
在libavformat/network.h文件中添加closesocket的声明#define closesocket close
。
一开始编译时使用SDL,由于结构体定义不同导致ffplay编译失败,后来修改为使用SDL2。并修改ffbuild/config.mak文件中的CONFIG_FFPLAY=yes
。
安装
执行make install命令安装到指定目录。
$ make install
将安装目录下的include/、lib/下所需要文件拷贝到开发板根目录下的对应位置。
至此FFmpeg已经配置完成,在之后的实际使用中再查找问题。