首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFmpeg对libstagefright硬件解码的支持

FFmpeg对libstagefright硬件解码的支持
EN

Stack Overflow用户
提问于 2014-09-13 00:24:15
回答 1查看 3.2K关注 0票数 11

大家:我是新来的。最近,我正在致力于将ffmpeg移植到android设备的项目。一开始,我用一种非常正常的方式编译了ffmpeg到共享库(.so文件),遵循互联网上的一些指南,将它们加载到我的安卓应用程序中。它工作得很完美。

现在我想让ffmpeg用libstagefright来完成HW解码。问题是,我可以编译.so库,但是当我启动我的应用程序并加载那些.so库时,总是有一个java.lang.UnsatisfiedLinkError:无法加载库: reloc_library1314: 114不能找到'_ZN7android11MediaBufferC1Ej‘

我在那里呆了几天。以前有没有人遇到过类似的问题?如果有人能给我一些关于这个错误的提示,那就太好了。

我的步骤是: 1.将ffmpeg-2.1.4源代码编译为.so共享库。我使用build_libstagefright脚本来完成这个任务,并根据来自互联网的一些指南进行了一些修改。

代码语言:javascript
复制
#!/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
  1. 将编译好的包含目录和库目录复制到我的android-ndk-r7/sources/ffmpeg-2.1.4/android/arm目录中。这个目录下的Android.mk文件是。 LOCAL_PATH:= $(打电话给我-dir) 包括$(CLEAR_VARS) LOCAL_MODULE:= libavcodec LOCAL_SRC_FILES:= lib/libavcodec-55.所以LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY) 包含$(CLEAR_VARS) LOCAL_MODULE:= libavformat LOCAL_SRC_FILES:= lib/libavformat-55.因此LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY) 包含$(CLEAR_VARS) LOCAL_MODULE:= libswscale LOCAL_SRC_FILES:= lib/libswscale-2.所以LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY) 包括$(CLEAR_VARS) LOCAL_MODULE:= libavutil LOCAL_SRC_FILES:= lib/libavutil-52.所以LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY) 包含$(CLEAR_VARS) LOCAL_MODULE:= libavfilter LOCAL_SRC_FILES:= lib/libavfilter-3因此LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY) 包含$(CLEAR_VARS) LOCAL_MODULE:= libwsresample LOCAL_SRC_FILES:= lib/libswresample 0.因此LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include包含$(PREBUILT_SHARED_LIBRARY)
  2. 在我的安卓应用程序的jni目录下,Android.mk是。 LOCAL_PATH:= $(调用my-dir)包括$(CLEAR_VARS) LOCAL_MODULE := libripple #LOCAL_CFLAGS := -Werror LOCAL_SRC_FILES := entrypoint.cpp scene.cpp LOCAL_LDLIBS := -llog -lGLESv2 -lm $(BUILD_SHARED_LIBRARY)包括$(BUILD_SHARED_LIBRARY)-llog myfflib en21# fflib.c en23#-L/mingzhang/ffmpeg_android/android-libs-libs-libsllog -ljnigraphics -lz -landroid -ldl -lm -llog -lgcc -lc -lstagefright -lmedia -lutils -lbinder #-lstdc++ LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libutils libstagefright libbinder libstdc++-6包括$(BUILD_SHARED_LIBRARY) $(调用导入模块,2.1.4/android/arm) Application.mk是: APP_ABI=armeabi-v7a #APP_STL=gnustl_static APP_STL=stlport_static

我不知道你还需要什么材料,如果有任何遗漏,请让我知道,我会上传它。非常感谢你们!

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 20:43:59

FFmpeg已经删除了https://github.com/FFmpeg/FFmpeg/commit/72673ad7eae2d4f685f3c0a895558502bfe07c8e (包括在n3.0中)对libstagefright的支持。提交消息:

代码语言:javascript
复制
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] http://stackoverflow.com/a/29362353/3115956

所以也许这已经不可能了。

你可能有更好的机会与AMediaCodecOpenMAX

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25818668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档