arm Linux*台下FFmpeg的移植

发布于:2021-11-27 12:11:21

??一个视频直播的项目,需要使用嵌入式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已经配置完成,在之后的实际使用中再查找问题。

相关推荐

最新更新

猜你喜欢