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 \ 这一行。
编译通过,整个引擎也编译通过。