【问题标题】:stagefright for ffmpeg: undefined symbol '_ZTIN7android11MediaSourceE'ffmpeg 的舞台惊吓:未定义的符号 '_ZTIN7android11MediaSourceE'
【发布时间】:2014-09-03 12:14:51
【问题描述】:

所有...我想尝试使用 libstagefright_h264 为 android 设备加速 ffmpeg hw。 似乎 ffmpeg 2.2.1 和 android 4.2.2 的源代码有点旧。 所以我尝试更新源代码,但是当我只编写如下代码时:

struct FFSource : public MediaSource {                                                                                   
    virtual status_t start(MetaData *params) { return -1; }                      
    virtual status_t stop() { return -1; }                                        
    virtual sp<MetaData> getFormat() { return sp<MetaData>(); }                  
    virtual status_t read(                                                                                               
            MediaBuffer **buffer, const ReadOptions *options) { return -1; }     
};

static av_cold int Stagefright_init(AVCodecContext *avctx)                                                            
{                                                                                                                        
    av_log(avctx, AV_LOG_ERROR, "In function: %s\n", __FUNCTION__);                                                      
    FFSource *decoder;                                                                                                   
    sp<MediaSource> mediaSource;

    decoder = new FFSource();                                                        
    return -1;
}

当我运行代码时它告诉我如下: 找不到“libavcodec-55.so”引用的符号“_ZTIN7android11MediaSourceE”...

结果显示 libavcodec-55.so 的 nm 命令:

[cxm@ubuntu ffmpeg-2.2.1.lsc]$nm ./libavcodec/libavcodec.so  | grep Source

003a31a8 t _ZN7android11MediaSource10setBuffersERKNS_6VectorIPNS_11MediaBufferEEE
003a319c t _ZN7android11MediaSource5pauseEv
         U _ZN7android11MediaSourceC2Ev
         U _ZN7android11MediaSourceD0Ev
         U _ZN7android11MediaSourceD1Ev
         U _ZN7android11MediaSourceD2Ev
003a31d0 t _ZN8FFSource4readEPPN7android11MediaBufferEPKNS0_11MediaSource11ReadOptionsE
003a31bc t _ZN8FFSource4stopEv
003a31b4 t _ZN8FFSource5startEPN7android8MetaDataE
003a31c4 t _ZN8FFSource9getFormatEv
003a3340 t _ZN8FFSourceD0Ev
003a32e0 t _ZN8FFSourceD1Ev
007b29f0 d _ZTC8FFSource0_N7android11MediaSourceE
007b29e0 d _ZTI8FFSource
         U _ZTIN7android11MediaSourceE
006ac028 r _ZTS8FFSource
007b2970 d _ZTT8FFSource
         U _ZTv0_n12_N7android11MediaSourceD0Ev
         U _ZTv0_n12_N7android11MediaSourceD1Ev
003a3330 t _ZTv0_n12_N8FFSourceD0Ev
003a32d0 t _ZTv0_n12_N8FFSourceD1Ev
007b2980 d _ZTV8FFSource

我在 libstagefright.so 中也找不到 _ZTIN7android11MediaSourceE。我认为我在编写源代码而不是错误链接 stagefright 库时有任何错误。 我使用 android 独立工具链来编译 ffmpeg 源代码。如下配置:

    function config_lsf                                                                                                                                                                             
    {
        # build flags                                                                                                                                                                               
        PREFIX=/home/cxm/work/Android/proj/dy-proj-careye/dy-proj-careye/jni/src/lib/android/            FLAGS="--prefix=$PREFIX"                                                                                                                                                                    
        FLAGS="$FLAGS --disable-static"                                                                                                                                                             
        FLAGS="$FLAGS --disable-doc"                                                                                                                                                                
        FLAGS="$FLAGS --disable-programs"                                                                                                                                                           
        FLAGS="$FLAGS --disable-avdevice"                                                                                                                                                           
        FLAGS="$FLAGS --disable-symver"                                                                                                                                                             
        FLAGS="$FLAGS --enable-shared"                                                                                                                                                              
        FLAGS="$FLAGS --cross-prefix=arm-linux-androideabi-"                                                                                                                                        
        FLAGS="$FLAGS --target-os=linux"                                                                                                                                                            
        FLAGS="$FLAGS --arch=arm"                                                                                                                                                                   
        FLAGS="$FLAGS --enable-cross-compile"                                                                                                                                                       

        FLAGS="$FLAGS --disable-decoder=h264"                                                                                                                                                       
        FLAGS="$FLAGS --disable-decoder=h264_vdpau"                                                                                                                                                 
        FLAGS="$FLAGS --enable-libstagefright-h264"                                                                                                                                                 

        # cflags                                                                                                                                                                                    
        CFLAGS="-Os -fpic -marm"                                                                                                 
        ANDROID_SOURCE=../mokesoures/                                                                                                                                                               
        ANDROID_LIBS=../android-libs                                                                                                                                                                
        CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"                                                                                                                                    
        CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/"                                                                                                                               
        CFLAGS="$CFLAGS -I$ANDROID_SOURCE/system/core/include"                                                                                                                                      
        CFLAGS="$CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"                                                                                                                             
        CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax/"                                                                                                                 

        # ld flags                                                                                                                                                                                  
        LDFLAGS="-Wl,--fix-cortex-a8"                                                                                                                                                               
        LDFLAGS="$LDFLAGS -lstdc++ -lgnustl_shared -lstagefright -lutils -lbinder"                                                                                                                  
        LDFLAGS="$LDFLAGS -L$ANDROID_LIBS"                                                                                                                                                          
        LDFLAGS="$LDFLAGS -Wl,-rpath-link,$ANDROID_LIBS"                                                                                                                   

        ./configure.android $FLAGS --extra-cflags="$CFLAGS" \                                                                                                                                       
            --extra-ldflags="$LDFLAGS" \                                                                                                                                                            

        sed -i 's/#define\ HAVE_POSIX_MEMALIGN\ 1/#define\ HAVE_POSIX_MEMALIGN\ 0/' ./config.h                                                                                                      
        make -j4 V=1 2>&1 | tee log                                                                                                                                                                 
        make install                                                                                                                                                                                
    }                                                                                                                                                                                               

请就这个话题提供帮助。非常感谢。

【问题讨论】:

  • 你能分享你的Android.mk文件吗?
  • 因为我使用android独立工具链编译ffmpeg所以我没有Android.mk。我只是重新编辑此主题以添加我的配置。非常感谢。
  • 我看不到您在confg_lsf 中启用 rtti 的位置。并且build_libstagefright 脚本显式设置EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"

标签: android android-ndk ffmpeg stagefright


【解决方案1】:

_ZTIN7android11MediaSourceEandroid::MediaSource 的类型信息。您可能在构建配置中启用了-frtti,但Android 库不包含运行时类型信息;因此,您应该至少从 FFSource 类中删除此标志。

【讨论】:

  • 亲爱的 Alex,您一定是 C/C++ 方面的专家,因为您通过符号名称指向 rtti!我想知道编译器如何将 c++ 函数转换为 c 函数?你能给我关于这个话题的任何建议吗?非常感谢...
  • “将 C++ 函数翻译成 C”是什么意思?要从 C 中获得 C++ 函数可调用,只需在函数声明之前添加extern "C"。 (请注意,C 不理解这一点;因此我们通常将其包装在 #ifdef __cplusplus 中的头文件中,这些头文件都包含在 .c.cpp 中)
  • 就我大学书的学习而言,c++代码应该在编译时先翻译成c代码。例如,C 类的成员函数 F() 应转换为 C 风格的函数,例如 F(C *this)。如果类 C 在 N 的命名空间下,我认为函数 F() 应该转换为 c 样式函数:N::F(C *this),好吗?
  • 这不是一个准确的描述。第一代 C++ 编译器确实如此,但今天它们不生成中间 C 代码。你为什么要问?还有一些 symbol mangling,编译器会为 C++ 方法和实体生成奇怪的符号名称(例如 _ZTIN7android11MediaSourceE)。您可以使用nm -C 以人类可读的形式查看这些符号。请注意,修改规则是特定于编译器的实现细节。
  • 仅供学习使用,想了解更多关于编译器如何工作的信息。非常感谢。
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多