前段时间移植servfox+spcaview到arm11上一直出现问题,由于网上很多说是内核版本高了,已经不再提供V4L的视频采集接口。而且servfox和spcaview都是支持V4L接口的,而不支持V4L2视频采集接口。所以产生不兼容的矛盾。虽然,我不太相信兼容的问题,但是又不愿意去实验低版本的内核(因为内核的交叉编译也是很烦的,而且漏洞百出,没工夫去研究),所以当把物理机的serfox和spcaview搞通了后就没有细致的去研究交叉编译serfox和spcaview了。后来就选择了ffmpeg。
早就听说ffmpeg很强大了,特别是他的压缩率很高,特别适合于做视频保存。原先我在PC linux下把ffmpeg编译玩了一遍,后来交叉编译到arm板子估计就不费很大的事情了,不过也是要花时间的,废话少收,现在来说说我交叉编译的过程。
编译环境: Vmware6.5+Fedora14
硬件平台: S3C6410
编译器: gcc-4.5.1、arm-linux-gcc-4.5.1
安装包及其版本:
SDL库文件: SDL-1.2.13.tar.gz
yasm汇编器: yasm0.7.2.tar.gz
MPEG视频编码器: x264-snapshot-20111111-2245-stable.tar.bz2
MPEG视频编解码器:xvidcore-1.1.3.tar.gz
ffmpeg源码包: ffmpeg-0.6.6.tar.gz
一 安装ffplay所需的SDL库(如果我们不需要ffplay,这一步可以省略)
1 下载SDL-1.1.3.tar.gz,网上很容易找到安装包。我这里提供一个地址:http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz
2 #tar zxvf SDL-1.2.13.tar.gz ; cd SDL-1.2.13
3 # ./configure --prefix=/usr/local --host=arm-linux --enable-shared
4 修改一下Makefile
将一下变量修改为下面这样:CC = arm-linux-gcc AR = arm-linux-ar RANLIB = arm-linux-ranlib
5 #make
可能会出现下面的错误:
./src/audio/dma/SDL_dmaaudio.c: In function 'DMA_WaitAudio':
./src/audio/dma/SDL_dmaaudio.c:166:3: error: impossible constraint in 'asm'
make: *** [build/SDL_dmaaudio.lo] Error 1
配置中加上--disable-video-x11这一项
那么重新配置Makefile
#make clean
#./configure --prefix=/usr/local --host=arm-linux --enable-shared --disable-video-x11
#make
同样执行第三步
6 make install
这样,我们SDL库文件就安装完成了
二 安装yasm(yasmx264需要用到的汇编编译器,不过后来感觉没有多大作用)
1 下载yasm0.7.2,可以选择高一点的版本,这里提供一个下载地址:http://www.tortall.net/projects/yasm/wiki/Download
2 #tar zxvf yasm0.7.2.tar.gz ; cd yasm0.7.2
3 #./configure --enable-shared --prefix=/usr/local/ --host=arm-linux
4 #make
5 #make install
三 x264视频编码器的安装
1 下载x264安装包,最好下高版本的,最近的安装包,不要太老了,否则会出现问题。因为x264安装包每天都在更新,这里提供下载网址:ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
2 #tar jxvf x264-snapshot-20111111-2245-stable.tar.bz2 ; cd x264-snapshot-20111111-2245-stable
3 # ./configure --prefix=/usr/local --enable-shared --host=arm-linux --disable-asm(第二步安装了yasm后就可以不用仅知道asm,但是没有--disable-asm就不行,大家可以尝试不加--disable-asm后看是什么效果)
4 修改Makefile
主要是修改config.mak,将相关参数修改如下:CC=arm-linux-gcc LD=arm-linux-gcc -o RANLIB=arm-linux-ranlib STRIP=arm-linux-strip
5 #make
6 #make install
四 安装视频编解码器xvid
1 下载xvid安装包,我这里提供了一个下载地址:http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz
2 #tar zxvf xvidcore-1.1.3.tar.gz ; cd xvidcore-1.1.3/build/generic
3 #./configure --prefix=/usr/local --host=arm-linux --target=arm-linux
#./configure --prefix=/usr/local/ --host=arm-hismall-linux --target=arm-hismall-linux
我还没研究透为何非要执行两次configure,不过如果只执行执行第一次configure,make就会出现下面的错误:
[root@sheryuan generic]# make
D: =build
C: ./decoder.c
cc1: error: unrecognized command line option "-freduce-all-givs"
make: *** [decoder.o] Error 1
4 修改Makefile
一些编译环境变量修改如下:--cc=arm-linux-gcc --as=arm-linux-as --ranlib=arm-linux-ranlib(如果as通不过,就不用修改,--as=as)
5 #make
6 #make install
五 安装ffmpeg
1 下载安装包,这里提供下载地址:http://ffmpeg.org/download.html
2 #tar zxvf ffmpeg-0.6.6.tar.gz ; cd ffmpeg-0.6.6
3 在/usr/local下新建目录ffmpeg-arm,将ffmpeg安装在此目录下
#mkdir /usr/local/ffmpeg-arm
3 # ./configure --prefix=/usr/local/ffmpeg-arm --enable-shared --enable-cross-compile --arch=arm --cpu=armv6 --target-os=linux --cc=arm-linux-gcc --enable-libx264 --enable-libxvid --enable-gpl --enable-pthreads --disable-stripping --ar=arm-linux-ar --ld=arm-linux-gcc --strip=arm-linux-strip --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
如果是高版本,需要加上--cxx=arm-linux-g++参数;如果编译出现ar错误,就不要这个参数
如果只需要安装ffmpeg,不需要全面安装ffplay,ffserver,ffprobe等附加程序,可以选用参数--disable-ffplay ,--disable-ffserver ,--disable ffprobe。但是根据我的测试发现,精简安装占用的空间比完全安装占用的空间少补了多少
4 修改Makefile
修改如下RANLIB=arm-linux-ranlib
如果需要安装ffplay,ffserver,ffprobe,那么确保CONFIG_FFPLAY=yes、CONFIG_FFPROBE=yes、CONFIG_FFSERVER=yes三项前面没有感叹号(!)
5 #make
6 #make install
六 打包
将安装的程序打包,包括可执行文件以及其执行依赖的库文件
#cd /usr/local
因为我们将ffmpeg依赖的SDL、yasm、x264、xvid安装在将/usr/local目录下,所以他们生成的库文件在/usr/local/lib下,所以我们要将/usr/local/lib目录下libSDL、libyasm、libx264、libxvidcore等库文件拷贝到ffmpeg安装目录的lib文件夹下,也就是/usr/lcoal/ffmpeg-arm/lib目录下,然后打包
#tar czvf ffmpeg-0.6.6-arm.tar.gz ffmpeg-arm/*
那么生成的ffmpeg-0.6.6-arm.tar.gz就可以拷贝到arm11上进行运行了
七 ARM平台上的配置
我们可以将linux虚拟机下交叉编译生成的ffmpeg-0.6.6-arm.tar.gz包放到/usr/local目录下,解压
#tar zxvf ffmpeg-0.6.6-arm.tar.gz
解压后,在/usr/local目录下会生成ffmpeg-arm目录,这是我们需要将该目录下的库文件拷贝到可以将其作为全局变量的库文件夹下,我一一般将其放到了/usr/local/lib目录下
#cp -rf ffmpeg-arm/lib/* lib/
#cd ffmpeg-arm
进入ffmpeg-arm目录,可以测试ffmpeg是否可用
至此,安装过程完成,当然也可能会出现一些问题,下面我列举了些我安装过程遇到的问题。
问题一:编译SDL时make出现下面的情况
make出错:
./src/audio/dma/SDL_dmaaudio.c: In function 'DMA_WaitAudio':
./src/audio/dma/SDL_dmaaudio.c:166:3: error: impossible constraint in 'asm'
make: *** [build/SDL_dmaaudio.lo] Error 1
这是由于我们编译时没有加上--disable-video-x11参数,加上此项后编译可以通过
问题二:ffmpeg用configure生成Makefile时,出现ERROR: libx264 not found 或者 ERROR: libxvid not found
在编译参数选择需要加上依赖的头文件和库文件:--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
这个问题原因我也不知道,大概就不是找不到libx264和libxvid安装的库文件路径,但是我是把他们安装在/usr/local目录下,查看/usr/local/lib目录也有它们相应的库文件,因为这个路径本身就是全局路径,按理说不是要特定的去再次指出他们的路径,但是没有这项参数就不会通过
问题三:make编译ffmpeg时,出现下面两类奇怪错误
ffmpeg Warning: File /tests/fate/vp8.mak' has modification time或
make: Warning: File `tests/fate/wma.mak' has modification time 3639293 s in the future
这两类问题很相似,但是我没找到实质性解决问题的方法,原先我本来编译的是ffmpeg-0.8.14,后来就出现这样的问题,后来搞了很久没弄出来,就换成0.6.6的版本,结果没有出问题。
其实我后来用ffmpeg-0.9.2,ffmpeg-1.0.4都没出现问题(x264用的是x264-snapshot-20130301-2245-stable),不过编译ffmpeg-1.1.3时又出现这样的问题,估计还是库的问题,所以没有得到实质性的解决,只有通过换ffmpeg的版本。x264的版本尽量用高版本,因为ffmpeg对x264的版本有要求,好像是要求x264的版本不小于某个版本,所以版本尽量高点更有保障。
当然还有其他的一些常识性的问题,这里我没有细说,也可能没有记下。