开发过程中使用ffmpeg进行h264解码,首先到ffmpeg官网下载最新的版本,可以git clone一下,然后将下载的ffmpeg放在一个jni文件夹下,进入ffmpeg目录下面,添加一个文件夹
android,在android目录下添加armv7-a目录,然后回到ffmpeg目录,添加一个config.sh的目录,内容如下:
NDK=/opt/android-ndk-r8d
PLATFORM=$NDK/platforms/android-8/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 \
--arch=arm \
--enable-nonfree \
--enable-asm \
--cpu=cortex-a8 \
--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 \
--disable-mdct \
--disable-parsers \
--enable-parser=h264 \
--disable-mmx \
--disable-bsfs \
--disable-filters \
--disable-network \
--disable-protocols \
--disable-optimizations \
--disable-indevs \
--disable-debug \
--disable-symver \
--disable-doc \
--disable-postproc \
--disable-stripping \
--disable-pthreads \
--disable-yasm \
--disable-vis \
--disable-vaapi \
--disable-vdpau \
--disable-sse \
--disable-ssse3 \
--disable-avx \
--disable-amd3dnow \
--disable-amd3dnowext \
--disable-hwaccels \
--enable-zlib \
--enable-pic \
--enable-pthreads \
--enable-small \
$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
LOCAL_ARM_NEON=true
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
然后将config.sh进行设置权限chmod +x config.sh,然后在终端下执行./config.sh,就会在android/armv7-a下生成libffmpeg.so文件,然后在自己在jni目录下面添加一个Android.mk,Application.mk文件。下面是我的两个文件:
LOCAL_PATH := $(call my-dir)
#declare the prebuilt library
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := ffmpeg/android/armv7-a/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg/android/armv7-a/include
LOCAL_EXPORT_LDLIBS := ffmpeg/android/armv7-a/libffmpeg.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)
#the andzop library
include $(CLEAR_VARS)
TARGET_ARCH_ABI=armeabi-v7a
LOCAL_ARM_NEON=true
LOCAL_ALLOW_UNDEFINED_SYMBOLS=false
#LOCAL_ARM_NEON=true
LOCAL_MODULE := ffmpeg-test
LOCAL_SRC_FILES := jniffmpeg/VideoDecoder.c
#LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/android/armv7-a/include
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/android/armv7-a/include \
$(LOCAL_PATH)/ffmpeg \
$(LOCAL_PATH)/ffmpeg/libavutil \
$(LOCAL_PATH)/ffmpeg/libavcodec \
$(LOCAL_PATH)/ffmpeg/libavformat \
$(LOCAL_PATH)/ffmpeg/libavcodec \
$(LOCAL_PATH)/ffmpeg/libswscale \
$(LOCAL_PATH)/jniffmpeg
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
LOCAL_LDLIBS := -llog -ljnigraphics -lz -lm $(LOCAL_PATH)/ffmpeg/android/armv7-a/libffmpeg.so
include $(BUILD_SHARED_LIBRARY)
APP_ABI := armeabi-v7a armeabi
APP_PLATFORM.:= android-8
在jni目录下输入ndk-build就会在jni同一层下生成一个libs文件,里面就有我们编译生成的NDK调用的库