Android ffmpeg ubuntu16.04下订制化的交叉编译

Android ffmpeg ubuntu16.04下订制化的交叉编译

  1. 知识准备

    ffmpeg是个重量级的音视频相关库,在编译ffmpeg之前需要对ffmpeg各部分的功能有所了解,这样才能订制化的编译出自己需要的so,你也不想编译出来的so加起来10M多吧

    libavcodec 包含全部FFmpeg音频/视频编解码库。
    libavformat:实现了流媒体协议(udp、rtp、rtmp、rtsp等),媒体容器(mp4、AVI、Flv等)和基本的I/O访问。
    libavutil:是一个实用程序库,以帮助便携式多媒体编程。它包含了安全的移动字符串函数,随机数生成器,数据结构, 附加数学功能,加密和多媒体相关的功能(如枚举的像素采样格式)。
    libavfilter:用于对多媒体滤镜的调用。
    libavdevice:提供用于从采集和渲染到许多常见多媒体输入/输出设备的通用框架,并支持多个输入和输出设备,包括Video4Linux2、VfW、DSHOW和ALSA。
    libswresample:实现音频的重采样和混音,根据平台做了优化(neon等)。
    libswscale:实现了颜色格式的转换和缩放,具有同样功能的另一个库是libyuv
    libpostproc:用于后期效果处理
    【ffmpeg】(ffmpeg官方说明)一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码。
    【ffserver】(ffserver官方说明)一个HTTP多媒体实时广播流服务器,支持时光平移。
    【ffplay】(ffplay官方说明)一个简单的播放器,基于SDL与FFmpeg库。
    【ffprobe】(ffprobe官方说明)一个简单的多媒体数据分析工具。

  2. ubuntu下的NDK环境配置

    环境变量配置:
    命令vim ~/.bashrc
    添加:
    export NDKROOT=/usr/ndk/android-ndk-r10e
    export PATH= N D K R O O T : PATH
    其中/usr/ndk/android-ndk-r10e 是我的ndk目录,注意改成自己的,千万不要复制过去完事儿啊

  3. 小试牛刀

    ffmpeg源码下载地址 从这里可以下载ffmpeg相关代码
    shell脚本内容(这里只演示arm)

#!/bin/bash
make clean
export NDK=/usr/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

在这里需要注意两点

  • shell脚本换行处不能有空格,否则编译不过去
  • android-9 要跟自己的最低版本一样

各个参数解释

  • –target-os=linux 进行交叉编译的平台
  • –prefix=$PREFIX 编译完成的库存放的目录
  • –arch 要编译的目标CPI结构(arm)
  • –disable-doc 不将文档编译进去
  • -enable-shared 编译动态库
  • –disable-static 不生成静态库
  • –disable-yasm 不编译 yasm
  • –disable-ffmpeg \
    –disable-ffplay \
    –disable-ffprobe \
    –disable-ffserver \ 禁止编译自带的工具
  • –enable-gpl 添加gpl协议
  • –enable-cross-compile 使用交叉编译
  • –cross-prefix 交叉编译用到的工具和库
  • –sysroot= 交叉编译所需要的系统根目录
  • -

这种方式编译的so动态库过大,总共有10M多 如图

这里写图片描述

有的人编译出来的so动态库后面会加小版本。而android是不识别的。这个时候只要修改configure里的命名配置即可
如图
这里写图片描述

这里将原有命名规则注释,将版本放于so前面,小版本去除。

订制化
configure脚本本身提供了订制化编译的功能,如图

这里写图片描述

这里写图片描述

用户可选择性的编译某模块或者此模块的某个内容,不过要注意各个模块之间的依赖关系,如图

这里写图片描述

下面实际操作一下 如

/configure \是一个配置脚本,配置选项特别多,可以运行./configure -h来查看有多少可配置项。
--disable-ffplay --disable-ffprobe --disable-ffserver \这三个是可执行程序,ffplay是播放器,ffserver是视频服务器
--disable-doc --disable-debug \关闭文档和debug选项
--prefix=./install --disable-shared --enable-static \指定安装目录,关闭共享库,使能静态库(缩小代码体积)
--enable-thumb --enable-neon --extra-cflags="-mthumb -mfpu=neon -mfloat-abi=hard" \使能thumb(缩小代码体积)使能neon浮点运算,指定编译器使用neon浮点运算
--disable-indevs --disable-outdevs --disable-bsfs --disable-protocols --disable-filters \
--disable-encoders --disable-decoders --disable-muxers --disable-demuxers --disable-parsers \
这十个对应的功能,我们先全部关闭然后再放开我们需要的,主要还是为了缩小代码体积。如果没有后面的配置,ffmpeg编译出是最小的体积,只是没有任何功能。
--enable-protocol=file \使能文件协议,这个必须放开
--enable-encoder=rawvideo --enable-encoder=mpeg4 \使能编码器rawvideo对应yuv,mpeg4对应mp4
--enable-decoder=rawvideo --enable-decoder=mpeg4 --enable-decoder=movtext \使能解码器,这里需要开启movtext才能解压mp4
--enable-muxer=aiff --enable-muxer=h263 --enable-muxer=mp4 --enable-muxer=rawvideo \使能合成器
--enable-demuxer=aac --enable-demuxer=aiff --enable-demuxer=h263 --enable-demuxer=mov --enable-demuxer=rawvideo \使能分离器
--enable-parser=aac --enable-parser=h263 --enable-parser=mpegaudio --enable-parser=mpeg4video \使能解析器
--enable-indev=v4l2 --enable-outdev=v4l2  使能输入设备,输出设备(如果不使能就只能编解码不能采集视频)
--enable-filter=scale 使能过滤器,这个是用来转换yuv的格式,yuv有多种格式要互相转换。

猜你喜欢

转载自blog.csdn.net/yangyasong/article/details/80565692