ffmpeg源码的编译和裁剪,生成安卓使用的.so库。

本文在mac os环境下编译ffmpeg源码:
1.准备工作:下载ndk和ffmpeg源码,我的是ndk-r10b,ffmpeg-3.2.1.
2.如图,将下载ndk和ffmpeg源码解压,放到同一目录下
这里写图片描述
3.切换到ffmpeg-3.2.1目录下修改congfigure文件,目的是去掉默认生成的.so库文件后的版本号。
将这四行:

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)'
  1. 在ffmpeg-3.2.1目录下创建一个脚本文件ffmpegconfig.sh,内容如下(源文件点此下载):
#!/bin/bash
NDK=/Users/hongenit/compileffm/android-ndk-r10b
export PATH=$PATH:$NDK
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64
function build_one
{
bash  ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffserver \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --extra-libs=-lgcc \
    --sysroot=$SYSROOT \
    --enable-asm \
    --enable-neon \
    --extra-cflags="-O3 -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm -mfpu=neon"
build_one

(注意:直接复制以上脚本在linux或mac os可能会导致很多command not found的错误,建议下载源文件并根据自己环境适当改写,或者手动敲,练练写脚本的手感。)

5.添加congfigure和ffmpegconfig.sh的执行权限:
sudo chmod +x congfigure
sudo chmod +x ffmpegconfig.sh
6.编译和安装:
./ffmpegconfig.sh
make -j8(参数-j8表示8线程工作,执行比较快)
make install

至此搞定,ffmpeg-3.2.1目录->android->arm->lib目录下会有七个生成的so库,但是七个so库再安卓下使用起来很麻烦,于是我们改进一下,只生成一个libffmpeg.so。这很easy,只需改脚本文件,其它基本相同。

修改脚本文件ffmpegconfig.sh的内容为:(源文件点此下载

#!/bin/bash
NDK=/Users/hongenit/compileffm/android-ndk-r10b
export PATH=$PATH:$NDK
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64
function build_one
{
bash  ./configure \
    --prefix=$PREFIX \
    --disable-shared \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-debug \
    --disable-decoders \
    --enable-decoder=h264 \
    --enable-decoder=aac \
    --disable-encoders \
    --enable-encoder=rawvideo \
    --disable-muxers \
    --enable-muxer=mp4 \
    --enable-muxer=rawvideo \
    --disable-filters \
    --enable-static \
    --disable-doc \
    --disable-ffserver \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --extra-libs=-lgcc \
    --sysroot=$SYSROOT \
    --enable-asm \
    --enable-neon \
    --extra-cflags="-O3 -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm -mfpu=neon"
build_one

make -j8
make install

$TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$SYSROOT/usr/lib -L$SYSROOT/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 -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
  • ./configure之后的参数 –disable-decoders \ 作用是禁用所有的解码器,然后再利用–enable-decoder=h264打开h264解码器。其它不需要的编码器,协议,过滤器,封装,解封装器可以按需裁剪。具体的参数在ffmpeg源码主目录下执行 ./configure –help 来显示参数列表。
  • 裁剪时需注意:如果加上了--disable-protocols \ 就必须打开文件协议 --enable-protocol=file \ 否则会报错No URL Protocols,没有文件协议不能打开文件。

  • 还有如果加上了

--disable-encoders  \  
--disable-muxers \

就必须打开文件协议

--enable-muxer=rawvideo  \  
--enable-encoder=rawvideo  \ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值