我是ffmpeg的新手.最近我正在进行项目,将ffmpeg移植到 Android设备.
在开始的时候,我将ffmpeg编译成共享的libs(.so文件),以一种非常正常的方式,按照Internet上的一些指导,将它们加载到我的Android应用程序中.它工作完美.
现在我想要ffmpeg使用libstagefright来完成硬件解码.
问题是,我可以编译.so libs,但是当我启动我的应用程序并加载这些.so libs,总是有一个java.lang.UnsatisfiedLinkError:
无法加载库:reloc_library [1314]:114找不到“_ZN7android11MediaBufferC1Ej”
我呆在那里几天.之前有人遇到过类似的问题吗?如果有人能给我一些关于这个错误的提示,这将是很棒的.
我的步骤:
1.将ffmpeg-2.1.4 souce代码编译成.so共享库.我使用build_libstagefright脚本执行此操作,并根据Internet上的一些指南进行一些修改.
- #!/bin/bash
- #export NDK=/home/mingzhang/android/android-ndk-r9c
- export NDK=/home/mingzhang/android/android-ndk-r7
- if [ "$NDK" = "" ]; then
- echo NDK variable not set,assuming ${HOME}/android-ndk
- export NDK=${HOME}/android-ndk
- fi
- echo "Fetching Android system headers"
- git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
- git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_av.git ../android-source/frameworks/av
- git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_native.git ../android-source/frameworks/native
- git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_hardware_libhardware.git ../android-source/hardware/libhardware
- git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core
- echo "Fetching Android libraries for linking"
- # Libraries from any froyo/gingerbread device/emulator should work
- # fine,since the symbols used should be available on most of them.
- #if [ ! -d "../android-libs" ]; then
- # if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
- # wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
- # fi
- # unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../
- # mv ../system/lib ../android-libs
- # rmdir ../system
- #fi
- SYSROOT=$NDK/platforms/android-9/arch-arm
- # Expand the prebuilt/* path into the correct one
- #TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64
- TOOLCHAIN=/home/mingzhang/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
- export PATH=$TOOLCHAIN/bin:$PATH
- ANDROID_SOURCE=../android-source
- ANDROID_LIBS=../android-libs
- ABI="armeabi-v7a"
- CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
- #CC=$TOOLCHAIN/bin/arm-eabi-gcc-4.4.3
- NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm
- #NM=$TOOLCHAIN/bin/arm-eabi-nm
- rm -rf ../build/stagefright
- mkdir -p ../build/stagefright
- ADDI_CFLAGS="-marm"
- DEST=../build/stagefright
- DEST="$DEST/$ABI"
- FLAGS="--target-os=linux --arch=arm --cpu=armv7-a --cross-prefix=arm-linux-androideabi- --cc=$CC --nm=$NM"
- #FLAGS="--target-os=linux --arch=arm --cpu=armv7-a --cross-prefix=arm-eabi- --cc=$CC --nm=$NM"
- FLAGS="$FLAGS --sysroot=$SYSROOT"
- #FLAGS="$FLAGS --disable-avdevice --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264"
- FLAGS="$FLAGS --enable-shared --disable-demuxers --disable-muxers --disable-parsers --disable-avdevice --disable-filters --disable-programs --disable-encoders --disable-decoders --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-decoder=libstagefright_h264 --enable-libstagefright-h264 \
- --enable-asm \
- --enable-neon \
- --enable-cross-compile \
- --enable-gpl \
- --disable-static \
- --enable-memalign-hack"
- EXTRA_CFLAGS="-I$DEST/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI/include"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/stlport/stlport"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon -marm -mtune=cortex-a8"
- EXTRA_CFLAGS="$EXTRA_CFLAGS -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -D_STLP_USE_NEWALLOC"
- EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI -static-libstdc++"
- EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"
- FLAGS="$FLAGS --prefix=$DEST"
- mkdir -p $DEST
- echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt
- ./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt
- [ $PIPESTATUS == 0 ] || exit 1
- make clean
- #make -j4 || exit 1
- #make -j4
- make install || exit 1
>将编译的include和lib目录复制到我的android-ndk-r7 / sources / ffmpeg-2.1.4 / android / arm目录中.此目录下的Android.mk文件是.
LOCAL_PATH:= $(调用my-dir)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib / libavcodec-55.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib / libavformat-55.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib / libswscale-2.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib / libavutil-52.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib / libavfilter-3.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
包括$(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib / libswresample-0.so
LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/ include
包含$(PREBUILT_SHARED_LIBRARY)
>在我的Android应用程序的jni目录下,Android.mk是.
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := libripple
- #LOCAL_CFLAGS := -Werror
- LOCAL_SRC_FILES := entrypoint.cpp scene.cpp
- LOCAL_LDLIBS := -llog -lGLESv2 -lm
- include $(BUILD_SHARED_LIBRARY)
- include $(CLEAR_VARS)
- LOCAL_MODULE := myfflib
- LOCAL_SRC_FILES := fflib.c
- LOCAL_LDLIBS := -L/home/mingzhang/ffmpeg_android/android-libs -llog -ljnigraphics -lz -landroid -ldl -lm -llog -lgcc -lc -lstagefright -lmedia -lutils -lbinder #-lstdc++
- LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libutils libstagefright libbinder libmedia libstdc++-6
- include $(BUILD_SHARED_LIBRARY)
- $(call import-module,ffmpeg-2.1.4/android/arm)
Application.mk是:
- APP_ABI=armeabi-v7a
- #APP_STL=gnustl_static
- APP_STL=stlport_static
我不知道你需要什么材料,如果有什么缺失,请让我知道,我会上传它.
非常感谢你们!
解决方法
- avcodec: Remove libstagefright
- It serves absolutely no purpose other than to confuse potentional
- Android developers about how to use hardware acceleration properly
- on the the platform. The stagefright "API" is not public,and the
- MediaCodec API is the proper way to do this.
- Furthermore,stagefright support in avcodec needs a series of
- magic incantations and version-specific stuff,such that
- using it actually provides downsides compared just using the actual
- Android frameworks properly,in that it is a lot more work and confusion
- to get it even running. It also leads to a lot of misinformation,like
- these sorts of comments (in [1]) that are absolutely incorrect.
- [1] https://stackoverflow.com/a/29362353/3115956
所以也许不可能了.
你可能有更好的机会与AMediaCodec
和OpenMAX.