arm Linux平台下FFmpeg的移植

2019-07-13 05: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/topeet/linux_x264 --enable-shared --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/下所需要文件拷贝到开发板根目录下的对应位置。 ffmpeg的安装 1、ffmpeg源码地址:http://ffmpeg.org          作者目前版本是ffmpeg-4.0.2         2、编译器:arm-none-linux-gnueabi 安装编译          1、生成makefile文件           主要就是更改./configure文件,按照网上很多前辈的经验,配置项如下: ./configure --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --target-os=linux --cc=arm-none-linux-gnueabi-gcc --arch=arm --prefix=/home/topeet/linux_ffmpeg --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-swscale --enable-pthreads --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-yasm --disable-stripping --enable-libx264 --extra-ldflags=-L/home/topeet/linux_x264/lib --extra-cflags=-I/home/topeet/linux_x264/include 记得要把libx264 的头文件和lib库加进去 要加在最后面 不然报错  出错: 之前我编译的时候会出错: arm-hisiv200-linux-gcc is unable to create an executable file. C compiler test failed.   If you think configure made a mistake, make sure you are using the latest version from Git.  If the latest version fails, report the problem to the ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net. Include the log file "config.log" produced by configure as this will help solve the problem.   》》》方法是要加入工具链的库,在/usr/local/lib 里,链接 上 -ldl 期间出现什么未找到,未定义,都是库路径或者没有加入该库。 还有出现的C compiler test failed. 都是工具链gcc路径不对,工具链没有加入头文件和库,没有加入 -ldl 或者加入的x264、librtmp、xvidcore、 libz、libcrypto、libssl等没有交叉编译。   然后         2、make        3、make install 把生成的lib下的文件 移植到arm板子上面的lib文件中,就可以了。   然后在板子上面  使用的 ./ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 /mnt/nfs/test.avi 就可以把usb摄像头的视频保存成avi的文件了,/mnt/nfs/ 下面是我挂在的文件系统。(有时候录制的视频会卡,是传输的挂在目录的时候有延迟,可以先保存在当前文件夹,在cp到/mnt/nfs/文件下面就可以了)