问题一:
由于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默认支持的默认编译选项仅支持ARMv5到ARMv5TE架构,因此如果要使用比较高级的特性的话有两种方法:
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"问题五:
在ndk-build的时候如果出现non-numeric second argument to `wordlist' function: ''.这个error是由于jni上层的AndroidManifest.xml的问题导致的。所以在生成so的时候,先把这个文件删除编译即可。
编译库的时候一定要与工程文件在一起是因为jni接口与包名的问题,下次修改jni层,只需要更新库文件,src改不改无所谓。问题六:
关于ffmpeg中avformat_open_input返回-1的问题有这样几种可能:在config.sh中demuxer被disable掉了路径错误,
比如在jni中访问sd卡中的文件要加/mnt
/mnt/sdcard/*
就是/mnt/sdcard/*文件格式不支持
通常支持mp4 avi flv
pFormatCtx没有赋值为NULL问题七:
ffmpeg | branch: master | Michael Niedermayer | Sat Dec 10 18:42:52 2011 +0100| [cc616431238c6c450a8bd53cf7983b12dda7f134] | committer: Michael Niedermayer
h264: improve "no picture" debug output.
Signed-off-by: Michael Niedermayer
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=cc616431238c6c450a8bd53cf7983b12dda7f134
---
libavcodec/h264.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Patchdiff --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.
在源码0062300624 "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