arm Linux平台下FFmpeg的移植

2019-07-12 18:48发布

  一个视频直播的项目,需要使用嵌入式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许可证。它提供了录制、转换以及流化音视频的完整解决方案。

1、下载源码

1.1 libx264
  下载地址:http://www.videolan.org/developers/x264.html 。我所使用版本为x264-snapshot-20171109-2245。
1.2 fdk_aac
  使用下面的命令进行下载: $ wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
1.3 FFmpeg
  下载地址:http://ffmpeg.org 。我所使用版本为ffmpeg-3.4。

2、编译安装

2.1 libx264
  配置 ./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/下所需要文件拷贝到开发板根目录下的对应位置。
2.2 fdk_aac
  配置
  运行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/下所需要文件拷贝到开发板根目录下的对应位置。
2.3 FFmpeg
  配置 ./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已经配置完成,在之后的实际使用中再查找问题。