• 记录一次Android交叉编译ffmpeg排查错误


    Android版本手机直播引擎中,引用了libvlc开源库。
    项目接过来,发现编译脚本中使用了很多用户名下的绝对路径。
    项目相关人离职,导致这个脚本实际上已经废掉。而且不知道相关路径下有没有其他文件和第三方库。
    琢磨很久,基本上搞定了路径问题。还剩下一个ffmpeg开源库编译脚本的选择问题。目录下有十几个文件备用。
    后来听说是用了一个名为ffmpeg_build.sh的脚本
    其中有一段

    #function build_one
    {
    ./configure 
    --arch=arm 
    --cpu=cortex-a8 
    --target-os=linux 
    --prefix=$prefix 
    --enable-cross-compile 
    --disable-shared 
    --enable-static 
    --extra-libs="-lgcc" 
    --cc=$CC 
    --cross-prefix=$NDK_TOOLCHAIN_BASE/bin/$NDK_ABI-linux-androideabi- 
    --sysroot="$NDK_SYSROOT" 
    --extra-cflags="-I$X264_PATH/include -I$FDKAAC_PATH/include -I$ARM_INC -march=armv7-a -mfloat-abi=softfp -mtune=cortex-a8 -mfpu=neon -fPIC" 
    --extra-ldflags="-L$FDKAAC_PATH/lib/android -L$X264_PATH/lib/android -lc -nostdlib -lm -ldl -mfloat-abi=softfp" 
    --disable-symver 
    --disable-doc 
    --disable-yasm 
    --disable-ffmpeg 
    --disable-ffplay 
    --disable-ffprobe 
    --disable-ffserver 
    --disable-protocols 
    --disable-debug 
    --disable-programs 
    --disable-encoders 
    --disable-decoders 
    --disable-filters 
    --disable-demuxers 
    --disable-avdevice 
    --disable-devices 
    --disable-muxers 
    --disable-parsers 
    --disable-armv6t2 
    --disable-armv5te 
    --disable-bsfs 
    --enable-small 
    --enable-gpl 
    --enable-network 
    --enable-neon 
    --enable-pthreads 
    --enable-libx264 
    --enable-zlib 
    --enable-nonfree 
    --enable-libfdk-aac 
    --enable-protocol=rtmp 
    --enable-muxer=flv 
    --enable-muxer=mp4 
    --enable-demuxer=aac 
    --enable-demuxer=h264 
    --enable-demuxer=flv 
    --enable-encoder=libfdk_aac 
    --enable-encoder=libx264 
    --enable-decoder=libx264 
    --enable-decoder=libfdk_aac 
    --enable-decoder=aac 
    --enable-decoder=h264 
    --enable-parser=aac 
    --enable-parser=h264 
    --enable-bsf=aac_adtstoasc 
    --enable-asm 
    $ADDITIONAL_CONFIGURE_FLAG
    
    make clean
    make -j4 install
    }

    直接编译使用,但是在vlc调用ffmpeg的过程中报错。

    于是根据需求,自己改写了一个版本ffmpeg_build_new.sh。其中那一段如下:

    #function build_one
    {
    ./configure 
    --arch=arm 
    --cpu=cortex-a8 
    --target-os=linux 
    --prefix=$prefix 
    --enable-cross-compile 
    --disable-shared 
    --enable-static 
    --extra-libs="-lgcc" 
    --cc=$CC 
    --cross-prefix=$NDK_TOOLCHAIN_BASE/bin/$NDK_ABI-linux-androideabi- 
    --sysroot="$NDK_SYSROOT" 
    --extra-cflags="-I$X264_PATH/include -I$FDKAAC_PATH/include -I$ARM_INC -march=armv7-a -mfloat-abi=softfp -mtune=cortex-a8 -mfpu=neon -fPIC -DANDROID" 
    --extra-ldflags="-L$FDKAAC_PATH/lib/android -L$X264_PATH/lib/android -lc -nostdlib -lm -ldl -llog -mfloat-abi=softfp" 
    --disable-everything 
    --disable-symver 
    --disable-doc 
    --disable-yasm 
    --disable-ffmpeg 
    --disable-ffplay 
    --disable-ffprobe 
    --disable-ffserver 
    --disable-parsers 
    --disable-protocols 
    --disable-demuxers 
    --disable-muxers 
    --disable-debug 
    --disable-filters 
    --disable-programs 
    --disable-armv6 
    --disable-armv6t2 
    --disable-armv5te 
    --disable-decoders 
    --disable-encoders 
    --enable-gpl 
    --enable-network 
    --enable-neon 
    --enable-pthreads 
    --enable-libx264 
    --enable-nonfree 
    --enable-libfdk-aac 
    --enable-protocol=rtmp 
    --enable-protocol=mp4 
    --enable-muxer=flv 
    --enable-muxer=mp4 
    --enable-encoder=libfdk_aac 
    --enable-encoder=libx264 
    $ADDITIONAL_CONFIGURE_FLAG
    
    make clean
    make -j4 install
    }

    按照这个脚本,编译出来的libavcodec.a比之前已经在使用的版本文件大小小很多。

    在意料中,因为我关掉了不用的编解码器和其他库。
    并且使用这个结果,也是报同样的错误。

    静下来想一想,我想起一个工具 at -t
    于是分析已经在使用的版本libavcodec.a

    $ ar -t ~/former/ffmpeg/lib/libavcodec.a 
    aac_ac3_parser.o
    aac_adtstoasc_bsf.o
    aac_parser.o
    aacadtsdec.o
    aacdec.o
    aacps.o
    aacpsdsp.o
    aacsbr.o
    aactab.o
    allcodecs.o
    aacpsdsp_init_arm.o
    aacpsdsp_neon.o
    fft_fixed_init_arm.o
    fft_fixed_neon.o
    fft_init_arm.o
    fft_neon.o
    fft_vfp.o
    fmtconvert_init_arm.o
    fmtconvert_neon.o
    fmtconvert_vfp.o
    fmtconvert_vfp_armv6.o
    h264chroma_init_arm.o
    h264cmc_neon.o
    h264dsp_init_arm.o
    h264dsp_neon.o
    h264idct_neon.o
    h264pred_init_arm.o
    h264pred_neon.o
    h264qpel_init_arm.o
    h264qpel_neon.o
    hpeldsp_neon.o
    idctdsp_arm.o
    idctdsp_armv6.o
    idctdsp_init_arm.o
    idctdsp_init_armv6.o
    idctdsp_init_neon.o
    idctdsp_neon.o
    jrevdct_arm.o
    mdct_fixed_neon.o
    mdct_neon.o
    mdct_vfp.o
    me_cmp_armv6.o
    me_cmp_init_arm.o
    pixblockdsp_armv6.o
    pixblockdsp_init_arm.o
    sbrdsp_init_arm.o
    sbrdsp_neon.o
    simple_idct_arm.o
    simple_idct_armv6.o
    simple_idct_neon.o
    startcode_armv6.o
    videodsp_init_arm.o
    audio_frame_queue.o
    audioconvert.o
    avdct.o
    avfft.o
    avpacket.o
    avpicture.o
    bitstream.o
    bitstream_filter.o
    cabac.o
    codec_desc.o
    dsputil_compat.o
    dv_profile.o
    error_resilience.o
    faandct.o
    faanidct.o
    fdctdsp.o
    fft_fixed.o
    fft_fixed_32.o
    fft_float.o
    fft_init_table.o
    fmtconvert.o
    frame_thread_encoder.o
    golomb.o
    h264.o
    h264_cabac.o
    h264_cavlc.o
    h264_direct.o
    h264_loopfilter.o
    h264_mb.o
    h264_parser.o
    h264_picture.o
    h264_ps.o
    h264_refs.o
    h264_sei.o
    h264_slice.o
    h264chroma.o
    h264dsp.o
    h264idct.o
    h264pred.o
    h264qpel.o
    idctdsp.o
    imgconvert.o
    jfdctfst.o
    jfdctint.o
    jrevdct.o
    kbdwin.o
    libfdk-aacenc.o
    libx264.o
    mathtables.o
    mdct_fixed.o
    mdct_fixed_32.o
    mdct_float.o
    me_cmp.o
    mpeg4audio.o
    mpegaudiodata.o
    options.o
    parser.o
    pixblockdsp.o
    pthread.o
    pthread_frame.o
    pthread_slice.o
    raw.o
    resample.o
    resample2.o
    sbrdsp.o
    simple_idct.o
    sinewin.o
    startcode.o
    utils.o
    videodsp.o

    共计122个c文件编译的.o

    同样分析ffmpeg_build_new.sh编译结果libavcodec.a
    发现只有30个差别太大。
    分析ffmpeg_build.sh编译结果libavcodec.a
    发现有123个,和线上版本很接近。
    马上对比一下文件名。仅仅是多了一个libfdk-aacdec.o

    现在明白了,ffmpeg_build.sh脚本中多了一个aac解码器,原作者更改并没有保存。
    立刻删除--enable-decoder=libfdk_aac 这一行。
    编译通过,整个引擎也编译通过。

  • 相关阅读:
    biji001
    公司内部openStack环境信息
    def
    CI调试
    一:Java之面向对象基本概念
    STL_算法_Heap算法(堆排)(精)
    IOS开发-经常使用站点集合
    【iOS开发-47】怎样下载iOS 7.1 Simulator 以及iOS 8离线的Documentation这些文件?
    设计模式简介
    how to deal with "no such file error or diretory" error for a new programmer in QT creator
  • 原文地址:https://www.cnblogs.com/zzugyl/p/5439207.html
Copyright © 2020-2023  润新知