1. 程式人生 > >Ubuntu編譯FFmpeg4.0.2單獨so庫(驗證可用)

Ubuntu編譯FFmpeg4.0.2單獨so庫(驗證可用)

1、修改ffmpeg-4.0.2原始碼下configure檔案
將該檔案中的如下四行:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替換為:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

2、編寫build_android.sh指令碼
#!/bin/bash
#修改點:1
PLATFORM=/home/working/Android5.1/prebuilts/ndk/9/platforms/android-19/arch-arm
#修改點:2;如果是Mac系統編譯路徑則是:xxx/darwin-x86_64/xxx
TOOLCHAIN=home/working/Android5.1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8
#修改點:3
PREFIX=home/working/ffmpeg_so_file

function build_one
{
    ./configure \
--prefix=$PREFIX \
--target-os=linux \
--disable-doc \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--disable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-ffplay \
--enable-cross-compile \
--disable-debug \
--enable-static \
--disable-asm \
--disable-symver \
--disable-stripping \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG


make clean
make -j8
make install


$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
libpostproc/libpostproc.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a #修改點4: 4.8 or 4.9
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
ADDI_CFLAGS="-marm"
build_one

3、報錯解決:
報錯一: libavcodec/aaccoder.c:803:25: error: expected identifier or '(' before numeric constant
                     int B0 = 0, B1 = 0;
解決:把 B0 修改為 b0(可以任意改成別的變數名)

報錯二: ibavcodec/hevc_mvs.c: In function 'derive_spatial_merge_candidates':
libavcodec/hevc_mvs.c:208:15: error: 'y0000000' undeclared (first use in this function)
             ((y ## v) >> s->ps.sps->log2_min_pu_size))

解決:prebuilts/ndk/current/platforms/android-21/arch-arm/usr/include/asm-generic/termbits.h 
或
prebuilts/ndk/current/platforms/android-21/arch-arm/usr/include/asm/termbits.h 
裡找到:#define B0的位置,在下邊新增一句:
#undef B0