#!/bin/bash
./configure --cc=gcc /
--cross-prefix=/opt/crosstool/arm-linux/bin/arm-linux- /
--cpu=arm-v4l /
--enable-gpl /
--enable-x264 /
--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib /
--enable-static /
--enable-decoder=x264
交叉编译器配置参数
Configured with: /home/pxa270/kernel_gcc_qt/pxa27x/gcc-3.4.3-glibc-2.3.2/build/arm-linux/gcc-3.4.3-glibc-2.3.2/gcc-3.4.3/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux --with-cpu=iwmmxt --enable-cxx-flags=-mcpu=iwmmxt --with-headers=/opt/crosstool/arm-linux/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long --without-fp
Thread model: posix
gcc version 3.4.3
libavutil version:49.0.0
libavcodec version:51.8.0
libavformat verion:50.4.0
编译过程中的问题及其解决
1、直接编译过程中,对于/libavcodec/x264.c的编译过程会找不到头文件x264.h,
解决方法:
将x264开源编码器中的/common/x264.h复制到ffmpeg/libavcodec/中,并修改x264.c
增加函数包括
static void x264_log_default( void *p_unused, int i_level, const char *psz_fmt, va_list arg )
void x264_param_default( x264_param_t *param )
int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal )
下面三个函数中由于牵涉很多其他函数,而且仅和编码器有关,我主要针对解码器,所以就#if 0, 然后将原x264.c中调用这三个函数的语句注释掉
x264_t * x264_encoder_open ( x264_param_t *param )
int x264_encoder_encode
void x264_encoder_close ( x264_t *h )
2、编译问题SNOW.C
对于编译SNOW.C,我的arm-linux-gcc (version 3.4.2)编译不下去,死机了,为了寻求解决方法,这里将snow.c的编译禁了,即在根目录FFMPEG/libavcodec/Makefile中
ifneq ($(CONFIG_SNOW_DECODER)$(CONFIG_SNOW_ENCODER),)
OBJS+= snow.o
endif
改为
ifneq ($(CONFIG_SNOW_DECODER)$(CONFIG_SNOW_ENCODER),)
# OBJS+= snow.o
endif
其实也就是取消了编解码库中的SNOW_DECODER和SNOW_ENCODER.同时将config.h和config.mak文件中的相关CONFIG_SNOW_* 定义改为0和no
其他关于snow编解码器的错误
/opt/crosstool/arm-linux/bin/arm-linux-gcc -Wl,--warn-common -rdynamic -L/usr/local/lib -g -o ffmpeg_g ffmpeg.o cmdutils.o -L./libavformat -lavformat -L./libavcodec -lavcodec -L./libavutil -lavutil -lm -ldl
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavformat.a when searching for -lavformat
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavcodec.a when searching for -lavcodec
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavutil.a when searching for -lavutil
./libavcodec/libavcodec.a(allcodecs.o)(.text+0x790): In function `avcodec_register_all':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/allcodecs.c:654: undefined reference to `snow_encoder'
./libavcodec/libavcodec.a(allcodecs.o)(.text+0x864):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/allcodecs.c:654: undefined reference to `snow_decoder'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x72c): In function `w53_8_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x884): In function `w97_8_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x9e8): In function `w53_16_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0xb40): In function `w97_16_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x38714): In function `dsputil_init':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_vertical_compose97i'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x38718):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_horizontal_compose97i'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x3871c):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_inner_add_yblock'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Error 1
解决方法:
在文件allcodecs.c中,将相关snow_encoder和snow_decoder的编解码注册器屏蔽
line 177// register_avcodec(&snow_encoder);
line 368// register_avcodec(&snow_decoder);(应该在Config.h和Config.mak修改时已经屏蔽了不会编译,我也不知道,改了才没有undefined reference to 'snow_encoder'和'snow_decoder'的错误)
ff_snow_vertical_compose97i等三个函数隶属于snow编码器的优化程序段,屏蔽这三个函数,此时这三个函数的实现将由c或其他指令行事的程序段完成功能
#if 0
#ifdef CONFIG_SNOW_ENCODER
c->vertical_compose97i = ff_snow_vertical_compose97i;
c->horizontal_compose97i = ff_snow_horizontal_compose97i;
c->inner_add_yblock = ff_snow_inner_add_yblock;
#endif
#endif
3、在ld连接时,发生-lx264选项无法辨识
解决方法
修改配置的config.mak文件,将EXTRALIBS=-lm -lx264 -ldl修改为EXTRALIBS=-lm -ldl就OK了
其中遇到的问题:
一、主机(虚拟机)和目标机的nfs mount:
目前的解决方法,
1、开启nfs服务,关闭iptables,nfslock服务,用setup命令或者主菜单-〉系统设置-〉服务器设置
2、在文件/etc/exports中加入共享文件目录,如/Video 192.168.0.*(rw,sync),将Linux下的Video目录共享于ip地址为192.168.0.1~192.168.0.254的所有主机,可读写。修改后保存,重启nfs服务,/etc/rc.d/init.d/nfs restart
3、将虚拟机中的Linux的eth0设定为192.168.0.120和Windows下的IP地址设为一致,目标机地址必须与主机地址在同一个网段,如192.168.0.110就可以了。
4、mount -a 192.168.0.120:/Video /mnt/nfs,挂载成功后,在目标机在访问时可能发生Permission Denial,权限不够的情况,只需将主机共享目录中的用户权限增加,如chmod 777 Video
TODO:
1、PXA270下加入视频显示部分,ffplay
2、Mplayer的相关移植工作
3、将X264的编码器加入
4、支持其他类型的编解码器