突然发现自己曾经做过的东西要记录下来,这样以后就不至于找不到了,早这样该多好。今天整理了一下之前做的demo,希望对你们也有用。如果哪里移植不好。加我qq:106601549
这只是个个简单的demo,要想处理好jni层的一些全局变量还需要一些功夫的,抛砖引玉,网上资料太少,自己try out
Android使用ffmpeg解码h265第一步就是进行ffmpeg的移植,这一点有很多资料可以参考,我这里贴一下我移植ffmpeg的configure:
#!/bin/bash
# configure your ndk root dir.
NDK=/home/zhangshiming/ndk-install-root/android-ndk-r10e
# configure your arch
SYSROOT=$NDK/platforms/android-12/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-debug \
--disable-encoders \
--disable-decoders \
--enable-decoder=hevc \
--enable-hwaccels \
--disable-muxers \
--disable-demuxers \
--enable-muxer=hevc \
--enable-demuxer=hevc \
--disable-parsers \
--enable-parser=hevc \
--disable-network \
--disable-protocols \
--disable-devices \
--disable-indevs \
--disable-outdevs \
--disable-yasm \
--enable-asm \
--enable-neon \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
#ADDI_CFLAGS="-marm"
ADDI_CFLAGS="-mfpu=neon -mfloat-abi=softfp"
build_one
---------------------------------------------------------以上是android_build.sh---------------------------------------------------------------
交叉编译, 这些选项,你自己./configure --help进行查看,这里我只保留了h265的解码器和一些filter,其余的都没有保留,编译完后的库很小,编译速度也很快,这才是使用ffmpeg最快速的办法。为了加速需要开启优化选项--enable-asm --enable-neon , 编译器选项一定要加上-mfpu=neon
编译好了后make install, 然后会在PREFIX=$(pwd)/android/$CPU 这个目录下,也就是android_build.sh 下生成一个android目录,进去把库拷贝出来就行了。
然后就是Android.mk了
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := prebuilt/libavcodec-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := prebuilt/libavformat-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := prebuilt/libavutil-55.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES := prebuilt/libswresample-2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := prebuilt/libswscale-4.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := VideoPlayer.c
LOCAL_LDLIBS += -llog -lz -landroid
LOCAL_MODULE := VideoPlayer
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_C_FLAGS += -mfpu=neon -mfloat-abi=softfp -fPIC
LOCAL_SHARED_LIBRARIES:= avcodec avformat avutil swresample swscale
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := SampleReader.c
LOCAL_LDLIBS += -llog -lz -landroid
LOCAL_MODULE := SampleReader
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_C_FLAGS += -mfpu=neon -mfloat-abi=softfp -fPIC