FFmpeg 编译(1)--多模块版(多个so文件)

前言

FFmpeg库是一个非常强大的音视频编解码库,只要有过流媒体相关开发经验的,相信对它都不会陌生。笔者是一个Android 开发者,所做的工作都是为Android服务的,其他的开发者,可自行略过。废话不多说,开始正题。

编译

笔者编译环境如下:

  • 系统 :Mac OS X 10.11.6
  • FFmpeg 版本 :3.1.2 (此版本已加入Android 的硬解码,之前用的是3.0版本,无硬解码)
  • NDK 版本: android-ndk-r10e

1、修改ffmpeg 根目录下的configure文件

找到如下代码(3.0版本在3050行左右,笔者版本在3208行)

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在生成so库时默认生成是libavcodec.so.56(生成.a文件时无此问题)这种格式,在Android中无法识别,要把后面的.56提到.so之前,当然也可以省略。

2、编写sh文件

笔者把文件命名为:build_andorid.sh,文件内容如下:

NDK=xxx/android-ndk-r10e   #指向你的NDK路径
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64

function build_android
{
    ./configure \
        --prefix=$PREFIX \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_dxva2 \
        --enable-hwaccel=mpeg4_vaapi \
        --enable-hwaccels \
        --enable-shared \              #编译出.so文件
        --enable-jni \                    #这行和下一行是打开mediacodec硬解码用的,          
        --enable-mediacodec \
        --disable-static \             #不生成.a文件
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --target-os=linux \
        --arch=arm \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make -j4
    make install
}

CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_android

3 、正式编译

把sh文件放入到FFmpeg的根目录,打开电脑的终端,进入到FFmpeg的根目录
运行 sh build_andorid.sh
剩下的就是等待

4、说明

编译完成之后会在FFmpeg的根目录下生成一个名为android的文件夹
编译出来的文件会存放在这里面
这种方式编译出的是多个.so 文件
下一篇会介绍如何编译单个.so 文件

    原文作者:esonyf
    原文地址: https://www.jianshu.com/p/33d974aca6aa
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞