对于libstagefright硬件解码支持的FFmpeg [英] FFmpeg support for libstagefright hardware decoding

查看:592
本文介绍了对于libstagefright硬件解码支持的FFmpeg的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家:
我是新来的ffmpeg。最近我工作的项目ffmpeg的端口到Android设备上。
在开始的时候,我编的ffmpeg在一个非常正常的方式共享库(.so文件)下在互联网上一些导游,它们加载到我的Andr​​oid应用程序。它完美的作品。

现在我想的ffmpeg使用libstagefright实现硬件解码。
问题是,我可以编译的.so库,但是当我启动我的应用程序并加载这些的.so库,总有一个java.lang.UnsatisfiedLinkError中:
无法加载库:reloc_library [1314] 114找不到'_ZN7android11​​MediaBufferC1Ej

我卡在那里了几天。有谁遇到过任何类似的问题?这将是巨大的,如果有人可以给我这个错误有些淡淡的。

我的步骤:
1.编译的ffmpeg-2.1.4源集code到是.so共享库。我用的是build_libstagefright脚本根据从互联网上一些导游要做到这一点,并提出一些修改。

 #!/斌/庆典
#export NDK = /家庭/ mingzhang /安卓/ Android的NDK-R9C
出口NDK = /家庭/ mingzhang /安卓/ Android的NDK-R7
如果[$ NDK=];然后
    回声NDK变量未设置,假设$ {HOME} / Android的NDK
    出口NDK = $ {HOME} / Android的NDK
科幻回声抓取Android系统头文件
混帐克隆--depth = 1 --branch姜饼释放的git://github.com/CyanogenMod/android_frameworks_bas​​e.git ../android-source/frameworks/base
混帐克隆--depth = 1 --branch姜饼释放的git://github.com/CyanogenMod/android_frameworks_av.git ../android-source/frameworks/av
混帐克隆--depth = 1 --branch姜饼释放的git://github.com/CyanogenMod/android_frameworks_native.git ../android-source/frameworks/native
混帐克隆--depth = 1 --branch姜饼释放的git://github.com/CyanogenMod/android_hardware_libhardware.git ../android-source/hardware/libhardware
混帐克隆--depth = 1 --branch姜饼释放的git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core回声抓取的Andr​​oid库链接
从任何升级Froyo /姜饼设备#库/仿真器应该工作
#精细,因为使用应可在多数人身上的符号。
#如果[! -d../android-libs];然后
#如果[! -f../update-cm-7.0.3-N1-signed.zip]​​;然后
#wget的http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P ../
#网络
#解压../update-cm-7.0.3-N1-signed.zip系统的/ lib目录/ * -d ../
#MV ../system/lib ../android-libs
#命令rmdir ../system
#fiSYSROOT = $ NDK /平台/ Android的9 /弓臂
#展开prebuilt / *路径改成正确的
#工具链= $ NDK /工具链/ ARM-Linux的androideabi-4.6 / prebuilt / Linux的x86_64的
TOOLCHAIN=/home/mingzhang/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/$p$pbuilt/linux-x86
出口PATH = $工具链/斌:$ PATH
ANDROID_SOURCE = .. / Android的源代码
ANDROID_LIBS = .. / Android的库
ABI =armeabi-V7A
CC = $工具链/斌/ ARM-Linux的androideabi-GCC
#CC = $工具链/斌/ ARM-EABI-GCC-4.4.3
NM = $工具链/斌/ ARM-Linux的androideabi纳米
#NM = $工具链/斌/ ARM-EABI纳米室射频../build/stagefright
MKDIR -p ../build/stagefrightADDI_CFLAGS = - MARM
DEST = .. /建设/ stagefright
DEST =$ DEST / $ ABI标志= - 目标OS = Linux的--arch =手臂--cpu =的ARMv7-A --cross- preFIX =臂Linux的androideabi- --CC = $ CC --nm = $ NM
#FLAGS = - 目标OS = Linux的--arch =手臂--cpu =的ARMv7-A --cross- preFIX =臂eabi- --CC = $ CC --nm = $ NM
FLAGS =$ FLAGS --sysroot = $ SYSROOT
#FLAGS =$ FLAGS --disable-avdevice --disable-DE codeR = H264 --disable德codeR = h264_vdpau --enable-libstagefright-H264
FLAGS =$ FLAGS --enable-共享--disable-分路器--disable-muxers --disable的解析器--disable-avdevice --disable过滤器--disable的程序--disable-CN codeRS - -disable德codeRS --disable德codeR = H264 --disable德codeR = h264_vdpau --enable-DE codeR = libstagefright_h264 --enable-libstagefright-H264 \\
    --enable-ASM \\
    --enable-霓虹灯\\
    --enable-交叉编译\\
    --enable-GPL \\
    --disable静电\\
    --enable-memalign可下锅EXTRA_CFLAGS = - I $ DEST /包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/本地/包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/原生/有/媒体/的OpenMAX
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/ AV /包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/基/包括-I $ ANDROID_SOURCE /系统/核心/包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /硬件/ libhardware /包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/基/媒体/ libstagefright
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ ANDROID_SOURCE /框架/基/有/媒体/ stagefright /的OpenMAX
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ NDK /来源/ CXX-STL / GNU-的libstdc ++ / 4.6 /包括-I $ NDK /来源/ CXX-STL / GNU-的libstdc ++ / 4.6 /库/ $ ABI /包括
EXTRA_CFLAGS =$ EXTRA_CFLAGS -I $ NDK /来源/ CXX-STL / stlport的/ STLport的
EXTRA_CFLAGS =$ EXTRA_CFLAGS -march =的ARMv7-A -mfloat-ABI = softfp -mfpu =霓虹灯-marm -mtune = Cortex-A8的
EXTRA_CFLAGS =$ EXTRA_CFLAGS -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H = 1 -D_STLP_USE_NEWALLOCEXTRA_LDFLAGS = - WL - 修复 - Cortex-A8的-L $ ANDROID_LIBS -Wl,-rpath链接,$ ANDROID_LIBS -L $ NDK /来源/ CXX-STL / GNU-的libstdc ++ / 4.6 /库/ $ ABI -static -libstdc ++
EXTRA_CXXFLAGS = - WNO-multichar -fno-例外-fno-RTTI
标志=$标志 - preFIX = $ DESTMKDIR -p $ DEST回声$ FLAGS --extra-CFLAGS =$ EXTRA_CFLAGS--extra-LDFLAGS =$ EXTRA_LDFLAGS--extra-CXXFLAGS =$ EXTRA_CXXFLAGS> $ DEST /信息.txt
的./configure $ FLAGS --extra-CFLAGS =$ EXTRA_CFLAGS--extra-LDFLAGS =$ EXTRA_LDFLAGS--extra-CXXFLAGS =$ EXTRA_CXXFLAGS|三通$ DEST / configuration.txt
[$ PIPESTATUS == 0] || 1号出口
使清洁
了#make -j4 || 1号出口
了#make -j4
使安装|| 1号出口

<醇开始=2>

  • 编译包括和lib目录复制到我的Andr​​oid的NDK-R7 /源/的ffmpeg-2.1.4 /安卓/ arm目录下。该目录下的Andr​​oid.mk文件。

    LOCAL_PATH:= $(叫我-DIR)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libav codeC
    LOCAL_SRC_FILES:= LIB / libav codec-55.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libavformat流
    LOCAL_SRC_FILES:= LIB / libavformat-55.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libswscale
    LOCAL_SRC_FILES:= LIB / libswscale-2.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libavutil
    LOCAL_SRC_FILES:= LIB / libavutil-52.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libavfilter
    LOCAL_SRC_FILES:= LIB / libavfilter-3.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)

    中包括$(CLEAR_VARS)
    LOCAL_MODULE:= libwsresample
    LOCAL_SRC_FILES:= LIB / libswresample-0.so
    LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/包括:
    包括$(preBUILT_SHARED_LIBRARY)


  • 在我的Andr​​oid应用程序的JNI目录,Android.mk是。

      LOCAL_PATH:= $(叫我-DIR)
    包括$(CLEAR_VARS)LOCAL_MODULE:= libripple
    #LOCAL_CFLAGS:= -Werror
    LOCAL_SRC_FILES:= entrypoint.cpp scene.cpp
    LOCAL_LDLIBS:= -llog -lGLESv2 -lm包括$(BUILD_SHARED_LIBRARY)包括$(CLEAR_VARS)LOCAL_MODULE:= myfflib
    LOCAL_SRC_FILES:= fflib.c
    LOCAL_LDLIBS:= -L /家庭/ mingzhang / ffmpeg_android / Android的库-llog -ljnigraphics -lz -landroid -ldl -lm -llog -lgcc -lc -lstagefright -lmedia -lutils -lbinder#-lstdc ++
    LOCAL_SHARED_LIBRARIES:= libavformat流libav codeC libswscale libavutil libutils libstagefright libbinder libmedia的libstdc ++ - 6包括$(BUILD_SHARED_LIBRARY)
    $(呼叫进口模块,的ffmpeg-2.1.4 /的Andr​​oid / 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 )。提交信息:

      AV codeC:删除libstagefright它提供其他绝对没有目的,只是混淆potentional
    Android开发如何正确使用硬件加速
    在该平台。该stagefrightAPI是不公开的,而
    媒体codeC API是这样做的正确方法。此外,在AV codeC stagefright支持需要一系列的
    魔法咒语和特定版本的东西,这样,
    使用它实际上提供了只是用实际相比缺点
    Android的框架恰当,因为它是一个很大的工作和混乱
    得到它,甚至运行。这也导致了很多误传,像
    这些各种各样的意见([1])是绝对不正确。[1] http://stackoverflow.com/a/29362353/3115956

    所以也许这是不可能的了。

    您可能有<一个更好的机会href=\"https://github.com/googlesamples/android-ndk/tree/3cd41e1f5280443665ca98463c7a76e80bf0b96c/native-$c$cc\"相对=nofollow> 阿兹马特codeC 和<一个href=\"https://github.com/googlesamples/android-ndk/tree/3cd41e1f5280443665ca98463c7a76e80bf0b96c/native-media\"相对=nofollow>的OpenMAX 。

    everyone: I am new to ffmpeg. Recently I am working on project to port ffmpeg to android device. At the beginning, I compiled ffmpeg to shared libs(.so files) in a very normal way following some guides on Internet, load them into my android app. It works perfectly.

    Now I want ffmpeg to use libstagefright to fulfill HW decoding. The problem is, I can compile the .so libs, but when I launch my app and load those .so libs, there is always a java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1314]: 114 cannot locate '_ZN7android11MediaBufferC1Ej'

    I stuck there for a few days. Does anyone encountered any similar problems before? It would be great if someone can give me some hint about this error.

    My steps: 1. Compile ffmpeg-2.1.4 souce code to .so shared libs. I use the build_libstagefright script to do this, and make some modification based on some guides from 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
    

    1. Copy the compiled include and lib directories to my android-ndk-r7/sources/ffmpeg-2.1.4/android/arm directory. The Android.mk file under this directory is.

      LOCAL_PATH:= $(call my-dir)

      include $(CLEAR_VARS) LOCAL_MODULE:= libavcodec LOCAL_SRC_FILES:= lib/libavcodec-55.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

      include $(CLEAR_VARS) LOCAL_MODULE:= libavformat LOCAL_SRC_FILES:= lib/libavformat-55.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

      include $(CLEAR_VARS) LOCAL_MODULE:= libswscale LOCAL_SRC_FILES:= lib/libswscale-2.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

      include $(CLEAR_VARS) LOCAL_MODULE:= libavutil LOCAL_SRC_FILES:= lib/libavutil-52.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

      include $(CLEAR_VARS) LOCAL_MODULE:= libavfilter LOCAL_SRC_FILES:= lib/libavfilter-3.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

      include $(CLEAR_VARS) LOCAL_MODULE:= libwsresample LOCAL_SRC_FILES:= lib/libswresample-0.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

    2. Under the jni directory of my android app, the Android.mk is.

      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)
      

      And the Application.mk is:

      APP_ABI=armeabi-v7a
      #APP_STL=gnustl_static
      APP_STL=stlport_static
      

    I am not sure what else materials you need, if anything is missing, please let me know, I will upload it. Thank you guys very much!!!

    解决方案

    FFmpeg has removed support for libstagefright at https://github.com/FFmpeg/FFmpeg/commit/72673ad7eae2d4f685f3c0a895558502bfe07c8e (included in n3.0). Commit message:

    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
    

    so maybe it is not possible anymore.

    You may have better chances with AMediaCodec and OpenMAX.

    这篇关于对于libstagefright硬件解码支持的FFmpeg的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆