android ffmpeg编译遇到的问题

上一篇 / 下一篇  2013-01-29 13:46:59 / 个人分类:多媒体开发

问题一:
由于Android环境非常复杂,框架都是用Java,因此要使用C/C++都需要做很多配置,使用汇编的话需要做更多的工作

我这边使用的是最新的Android4.0的开发工具,NDK也是最新支持4.0的。这个NDK与老版本的有一些比较明显的不同。

由于我用的是Mac OS X,因此配置起来比瘟抖死上的要容易许多,你不需要再装些杂七杂八的第三方工具,直接可以使用你下载好的NDK

首先,设置目标路径——在你的Terminal中进入NDK的根目录,随后打NDK_PROJECT_PATH="<你要编译的项目路径>"。回车,再输入export NDK_PROJECT_PATH

回车。

这里要注意的是NDK_PROJECT_PATH=后面的路径需要加引号,否则无效。



由于NDK默认支持的默认编译选项仅支持ARMv5ARMv5TE架构,因此如果要使用比较高级的特性的话有两种方法:

1、你有办法将TARGET_ARCH_ABI的值变为armeabi-v7a,俺自己试了一下,木有成功。因此可以使用第二种方法,更简单便捷:

2、在你的NDK目录下,找到toolchains,然后找到arm-linux-androideabi-x.y.z目录,在进去可以发现setup.mk文件。找到-march=armv7-a,将上面的神马#ifdef都去掉,下面的#endif也都删了。这样就能确保编译器使用ARMv7A来编译。

问题二:
error: libavutil/samplefmt.h: No such file or directory compilation terminated

ffmpeg目录下运行
cat libavcodec/avcodec.h | libavcodec/codec_names.sh config.h libavcodec/codec_names.h

问题三:


libavformat/libavformat.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'

libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here

libavutil/libavutil.a(log2_tab.o):(.rodata+0x0): multiple definition of `ff_log2_tab'

libavcodec/libavcodec.a(log2_tab.o):(.rodata+0x0): first defined here

解决办法:移植ffmpeg的时候如果遇到这样的情况,在两个文件的Makefile中删掉一个log2_tab.o文件就可以了

问题四:
/home/seuic-exp/video/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld: error: cannot find -ljnigraphics

ndk-build的时候会出现这个问题,吧.c文件中的<jni.h>改成"jni.h"

问题五:
ndk-build的时候如果出现non-numeric second argument to `wordlist' function: ''.这个error是由于jni上层的AndroidManifest.xml的问题导致的。所以在生成so的时候,先把这个文件删除编译即可。

编译库的时候一定要与工程文件在一起是因为jni接口与包名的问题,下次修改jni层,只需要更新库文件,src改不改无所谓。

问题六:
关于ffmpegavformat_open_input返回-1的问题有这样几种可能:
    • config.shdemuxerdisable掉了路径错误,

    • 比如在jni中访问sd卡中的文件要加/mnt /mnt/sdcard/*

    • 就是/mnt/sdcard/*文件格式不支持 通常支持mp4 avi flv

    • pFormatCtx没有赋值为NULL

问题七:
ffmpeg | branch: master | Michael Niedermayer <michaelni@gmx.at> | Sat Dec 10 18:42:52 2011 +0100| [cc616431238c6c450a8bd53cf7983b12dda7f134] | committer: Michael Niedermayer h264: improve "no picture" debug output. Signed-off-by: Michael Niedermayer <michaelni@gmx.at> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=cc616431238c6c450a8bd53cf7983b12dda7f134 --- libavcodec/h264.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)

Patch

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index d35938c..a9a5277 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1531,7 +1531,7 @@  static void decode_postinit(H264Context *h, int setup_finished){
         } else
             h->next_outputed_poc = out->poc;
     }else{
-        av_log(s->avctx, AV_LOG_DEBUG, "no picture\n");
+        av_log(s->avctx, AV_LOG_DEBUG, "no picture %s\n", out_of_order ? "ooo" : "");   //源码的1514}
 
     if (h->next_output_pic && h->next_output_pic->sync) {
问题八:
12-29 08:46:28.265: D/ffmpeg(9857): No accelerated colorspace conversion found from yuv420p to rgb565le.



在源码00623

av_log(c,AV_LOG_WARNING,

00624            "No accelerated colorspace conversion found from %s to %s.\n",
00625av_get_pix_fmt_name(c->srcFormat),av_get_pix_fmt_name(c->dstFormat));

问题九:

enable-asm

/opt/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ranlib "./android/armv7-a/lib/libavcodec.a"

libavcodec/libavcodec.a(fft_fixed_init_arm.o): In function `ff_fft_fixed_init_arm':

fft_fixed_init_arm.c:(.text.unlikely+0x2c): undefined reference to `ff_fft_fixed_calc_neon'

libavcodec/libavcodec.a(fft_init_arm.o): In function `ff_fft_init_arm':

fft_init_arm.c:(.text.unlikely+0x30): undefined reference to `ff_fft_permute_neon'

fft_init_arm.c:(.text.unlikely+0x34): undefined reference to `ff_fft_calc_neon'

使用最新的版本就没有这个问题,我现在最新版本时1.1.1,好像出现这个问题的在1.0.1版本
问题十:
能够编译neon,同时arm

NDK=/opt/android-ndk-r8d

PLATFORM=$NDK/platforms/android-14/arch-arm/

PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86





function build_one

{

./configure --target-os=linux \

--prefix=$PREFIX \

--enable-cross-compile \

--enable-nonfree \

--enable-asm \

--cpu=cortex-a8 \

--arch=armv7-a \

--enable-neon \

--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--nm=$PREBUILT/bin/arm-linux-androideabi-nm \

--sysroot=$PLATFORM. \

--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 $OPTIMIZE_CFLAGS " \

--disable-shared \

--enable-static \

--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avfilter \

--disable-avdevice \

--disable-swscale \

--disable-swresample \

--disable-muxers \

--disable-demuxers \

--disable-encoders \

--disable-decoders \

--enable-avformat \

--enable-avcodec \

--enable-decoder=h264 \

--enable-fft \

--enable-mdct \

--disable-parsers \

--enable-parser=h264 \

--enable-yasm \

--enable-vis \

--disable-mmx \

--disable-mmx2 \

--disable-bsfs \

--disable-filters \

--disable-network \

--disable-protocols \

--disable-optimizations \

--disable-indevs \

--disable-debug \

--disable-symver \

--disable-doc \

--disable-postproc \

--disable-stripping \

--disable-pthreads \



$ADDITIONAL_CONFIGURE_FLAG





make clean

make -j4 install



$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

}



#arm v7 neon

#CPU=armv7-a

#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -mcpu=cortex-a8"

#PREFIX=./android/$CPU

#ADDITIONAL_CONFIGURE_FLAG=

#build_one



#arm v7 vfp3

CPU=armv7-a

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU"

PREFIX=./android/$CPU

ADDITIONAL_CONFIGURE_FLAG=

build_one




TAG:

 

评分:0

我来说两句

Open Toolbar