本文简单介绍一下ffmpeg移植过程和中间碰到的一些问题,尤其是碰到的关于软硬浮点的问题。
1、移植步骤
ffmpeg的一些功能需要以下库的支持,yasm、x264、xvidcore、SDL;若后续不需要相关功能,无需移植安装。

安装的版本的是ffmpeg-3.0.2,可至ffmpeg官网下载。编译工具链是arm-linux-gnueabihf-4.7,一定要参照开发板的工具链选择版本,否则可能版本过高无法运行或者使用arm-linux-gcc导致软硬浮点问题。

(1)解压、放置路径跳过,进入ffmpeg文件夹

./configure –cross-prefix=arm-linux-gnueabihf- –arch=armv7-a –target-os=linux –prefix=/home/nfs/arm/ffmpegv0.1 –enable-ffmpeg –disable-ffplay –enable-ffserver –disable-ffprobe –disable-devices –disable-iconv –disable-bzlib –disable-xlib

根据自身需要进行删减,这里启用了ffmpeg、ffserver。
(2)make,make install
在make install的时候,可能 会出现arm-linux-ranlib没有发现,这是因为 make install是在root下做的,而arm-linux-ranlib在用户的工作环境中才能找到。所以产生了这里的错误。
解决如下:
执行make install之前,先用下su命令取得root权限(或sudo -i)。然后再执行make install。
su 和 sudo 的区别:
1.共同点:都是root用户的权限;
2.不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境;sudo是完全取得root的权限和root的工作环境。

2、剪裁
生成的ffmpeg执行程序加上lib有70M,体积太大,可以去除删减大部分的功能,不建议–enable-small,其实是牺牲编码解码速度来换取动态库的瘦身。最简单的方法是,先disable掉一堆东西,再根据需要添加。具体参考。./configure –help
可以参考下面(这里只生成动态库)
./configure –cross-prefix=arm-linux-gnueabihf- –arch=armv7-a –target-os=linux –prefix=/home/nfs/arm/ffmpegv0.1 –disable-everything –disable-muxers –disable-avdevice –disable-armv5te –disable-armv6 –disable-armv6t2 –disable-zlib –disable-bzlib –disable-debug –disable-ffmpeg –disable-ffserver –disable-ffplay –disable-muxers –disable-filters –disable-devices –disable-encoders –disable-hwaccels –enable-static –enable-memalign-hack –enable-decoder=h264 –enable-demuxers –enable-parsers –enable-protocols
大约6M左右。

3、软硬浮点
实际上,在开始的时候,我的工具链是arm-linux-gcc,ffmpeg版本是0.8.4的版本,在编译时无报错,开发板上也可以运行。之后编译ffmpeg新版本的时候,程序在运行的时候会报错,提示:
expected re INT64 but found 1
bug=1.00000 “bug” is not a valid set of 32bit interger
我找了很长的时间,都没发现问题,网上也很少参考。

实际上是由于开发板的gcc是arm-linux-gnueabihf,默认浮点操作是硬浮点;而在编译的时候使用的arm-linux-gcc-4.4.3则是软浮点。

硬浮点Hard-float
编译器将代码直接编译成发给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。

软浮点 Soft-float
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。
现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。