android – FFmpeg支持libstagefright硬件解码

前端之家收集整理的这篇文章主要介绍了android – FFmpeg支持libstagefright硬件解码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大家:
我是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

我不知道你需要什么材料,如果有什么缺失,请让我知道,我会上传它.
非常感谢你们!

解决方法

FFmpeg已经在 https://github.com/FFmpeg/FFmpeg/commit/72673ad7eae2d4f685f3c0a895558502bfe07c8e(包括在n3.0中)中删除了对libstagefright的支持.提交消息:
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

所以也许不可能了.

你可能有更好的机会与AMediaCodecOpenMAX.

原文链接:https://www.f2er.com/android/311520.html

猜你在找的Android相关文章