本文在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)'
- 在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 \
- 编译完成后,在android->arm目录下会有一个libffmpeg.so,这个so库就可以在安卓下使用了。安卓下使用请参考:手摸手一步步教你裁剪编译ffmpeg并用于实现安卓端解码