Android FFmpeg编译与Android集成

1.NDK与FFmpeg下载

NDK下载:
1.下载:在浏览器,下载中心,复制链接地址:
	https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn
2.wget 去下载操作:
    wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn

3.修改名称:
    mv android-ndk-r17c-linux-x86_64.zip\?hl\=zh_cn android-ndk-r17c-linux-x86_64.zip
   
4.解压
    unzip android-ndk-r17c-linux-x86_64.zip
FFmpeg下载:
http://www.ffmpeg.org/releases/
wget http://www.ffmpeg.org/releases/ffmpeg-4.0.4.tar.bz2
解压:
tar -xjf ffmpeg-4.0.4.tar.bz2

2.FFmpeg介绍

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、MacOS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等

模块功能 介绍:

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;

libavcodec:用于各种类型声音/图像编解码

libavutil:包含一些公共的工具函数;

libswscale:用于视频场景比例缩放、色彩映射转换;

libavfilter:用于增加滤镜等特效处理

libswresample:音频重采样

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

3.编译FFmpeg

3.1生成MakeFile以及创建结果存放文件夹

./configure --disable-x86asm   生成 Makefile,关闭 asm

#生成目录
mkdir android
#生成目录
mkdir armeabi-v7a

#给root权限
sudo sh 

3.2创建构建脚本

#生成build脚本
gedit build.sh


3.3将下面的内容,拷贝到build.sh 脚本

#!/bin/bash
NDK_ROOT=/home/derry/android-ndk-r17c
#TOOLCHAIN 变量指向NDK中的交叉编译gcc所在的目录

TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
#FLAGS与INCLUDES变量 可以从 AS ndk工程的。externalnaticveBuild/camake/debug/armeabi-v7a/build.ninja中拷贝需要,注意的是**地址**
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fno-limit-debug-info  -fPIC"

INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/surpport/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include"

PREFIX=./android/armeabi-v7a
./configure \
--prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-17/arch-arm \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=17 -U_FILE_OFFSET_BITS  -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC" \
--arch=arm \
--target-os=android

make clean
make install
  • 执行configure脚本,用于生成makefile
  • –prefix:安装目录
  • –enable-small:优化大小
  • –disable-avdevice:关闭所有编码器(播放不需要编码)
  • –disable-muxers:关闭所有复用器(封装器),不需要生成MP4这样的文件,所以关闭
  • –disable-filters:关闭视频滤镜
  • –enable-cross-compile:开启交叉编译
  • disable-shared enable-static:不写也可以,默认就是这样
  • –sysroot
  • –extra-cflags:会传给gcc的参数
  • –arch–target-os:

3.4开始构建

#开始构建
sh build.sh 

3.5构建产物介绍

构建完成后在./android/armeabi-v7a 路径下面存在
include  lib  share 这三个文件夹 就代表编译成功了

编译内容介绍:
share:	是相关的demo例子
lib:	是生成的目标库文件
include:是头文件

3.6将生成的内容全部压缩

#如果是服务器,将内容打包压缩,使用rz方便拷贝出来使用
zip -r ffmpeg.zip ./*

3.7动态库和静态库配置切换

#生成静态库的配置
--disable-shared \
--enable-static \

#生成静态库
--enable-shared \
--disable-static \

4.Android中集成

4.1动态库的集成:

  • 将头文件include全部拷贝放置在Android工程cpp的路径下面

  • 在main文件夹下面,新建jniLibs文件夹,然后新建armeasbi-v7a文件夹,将生成的动态库拷贝进去(6个)

  • 配置build.gradle 在defaultConfig中添加

    //影响的是编译期使用的cpu指令级
    externalNativeBuild {
          
          
                cmake {
          
          
                    //如果这里配置的指令集 工程不存在编译会报错
                    abiFilters "armeabi-v7a"
                }
            }
    //影响的是最终生成apk安装包 内部包含的指令集
            ndk{
          
          
                //如果这里配置的指令级工程不存在 生成的apk安装包只会包含存在的指令集
                abiFilters "armeabi-v7a"
            }
    
  • 配置 CMakeLists.txt

    #导入头文件
    include_directories("${CMAKE_SOURCE_DIR}/include/")
    
    # 第二步:导入库文件
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
    
    #将库链接进去
    target_link_libraries( # Specifies the target library.
                           native-lib
    
            avcodec
            avfilter
            avformat
            avutil
            swresample
            swscale
    
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )
                           
    #如果出现so依赖顺序问题,使用下面命令进行包裹
    #        -Wl,--start-group # 忽略顺序引发的问题
    #        -Wl,--end-group
    
  • 导入头文件,并进行api调用

    //因为是纯c库,必须混合编译的方式include
    extern "C" {
          
          
    #include <libavutil/avutil.h>
    }
    
    std::string ffmpegVersion = "当前的FFmpeg的版本是:";
    ffmpegVersion.append(av_version_info());
    return env->NewStringUTF(ffmpegVersion.c_str());
    

4.2静态库

在cpp文件夹下面创建armeabi-v7a,将所有的静态库拷贝进去,然后配置CmakeLists.txt

#静态库
set(CMAKE_CXX_FLAGS "${
      
      CMAKE_CXX_FLAGS} -L${
      
      CMAKE_SOURCE_DIR}/${
      
      CMAKE_ANDROID_ARCH_ABI}")

只需要将加载库的配置,改一下就行,其他的不用变就可以了

5.FFmpeg configure帮助部分内容总结

FFmpeg帮助选项输出到本地,以便查看

./configure --help -> ffmpeg_help.txt

ffmpeg_help.txt

./configure --help 查看帮助内容
Help options:
--help print this message 【当前所看到的所有内容,就是用--help输出 的帮助信息】
--quiet Suppress showing informative output 【禁止显示信息输出】

--list-decodersshow all available decoders【显示所有可用的解码器】(*****************************)
--list-encodersshow all available encoders【显示所有可用的编码器】(*****************************)
--list-hwaccels how all available hardware accelerators 【显示所有可用的硬件加速器】

--list-demuxers show all available demuxers 【显示所有可用的解复用器】
--list-muxers show all available muxers 【列出所有支持的封装】
--list-parsers show all available parsers 【显示所有可用的解析器】
--list-protocols show all available protocols 【列出支持的通信协议】
--list-bsfs show all available bitstream filters 【显示所有可用的位流筛选器】


--list-indevs show all available input devices 【显示所有可用的输出设备】

--list-outdevs show all available output devices 【显示所有可用的输出设备】


--list-filters show all available filters 【显示所有可用过滤器,当要做复杂特效时,就有用】


【disable 关闭】
【enable 开启】


--logfile=FILE  log tests and output to FILE [ffbuild/config.log] 【编译时日志信息输出路径,默认:ffbuild/config.log】
--disable-logging  do not log configure debug information 【关闭:不记录配置调试信息】


--fatal-warnings fail if any configure warning is generated 【如果生成任何配置警告则失败,注意:不能加,因为编译过程中,警告是会有的】


--prefix=PREFIX  install in PREFIX [/usr/local]【我们最终产出的目录】(*****************************)

--bindir=DIR  install binaries in DIR [PREFIX/bin] 【在目录中安装二进制文件】 PREFIX
--datadir=DIR  install data files in DIR [PREFIX/share/ffmpeg] 【在目录中安装数据文件】 PREFIX
--docdir=DIR	install documentation in DIR[PREFIX/share/doc/ffmpeg] 【在目录中安装文档】 PREFIX	
--libdir=DIR  install libs in DIR [PREFIX/lib] 【在目录中安装libs】
--shlibdir=DIR install shared libs in DIR [LIBDIR] 【在目录中安装共享库】
--incdir=DIR install includes in DIR [PREFIX/include] 【在目录中安装includes】 PREFIX
--mandir=DIR install man page in DIR [PREFIX/share/man] 【在目录中安装手册页】 PREFIX
--pkgconfigdir=DIR install pkg-config files in DIR [LIBDIR/pkgconfig] 【在目录中安装pkg配置文件】
--enable-rpath   use rpath to allow installing libraries in paths 【使用rpath允许在路径中安装库】
--install-name-dir=DIR  Darwin directory name for installed targets 【已安装目标的目录名】


#许可选项
--enable-gpl  allow use of GPL code, the resulting libs and binaries will be under GPL [no]
--enable-version3 upgrade (L)GPL to version 3 [no]
--enable-nonfree  allow use of nonfree code, the resulting libs and binaries will be unredistributable [no]

#配置选项,关系到 编译成动态库 或 静态库
--disable-static do not build static libraries [no] 【生成静态库】 (*****************************)
--enable-shared  build shared libraries [no] 【不生成动态库】 (*****************************)
--enable-small   optimize for size instead of speed 【可以优化库的大小,可以尝试加入进去】 (*****************************)
--disable-runtime-cpudetect disable detecting CPU capabilities at runtime (smaller binary)
--enable-gray      enable full grayscale support (slower color)
--disable-swscale-alpha disable alpha channel support in swscale
--disable-all  disable building components, libraries and programs
--disable-autodetect disable automatically detected external libraries [no]


#在 Windows/Linux/MacOS 编译出 ffplay,ffmpeg 可执行程序,不支持Android
--disable-programs  do not build command line programs
--disable-ffmpeg disable ffmpeg build 【ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;】
--disable-ffplay disable ffplay build 【ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;】
--disable-ffprobe disable ffprobe build 【分析媒体文件信息】


#Documentation options:
--disable-doc do not build documentation
--disable-htmlpages do not build HTML documentation pages
--disable-manpages  do not build man documentation pages
--disable-podpages do not build POD documentation pages
--disable-txtpages  do not build text documentation pages


#Component options:
--disable-avdevice disable libavdevice build 【可以操作我们的摄像头,视频输出等等,(但是在Android中是不支持的)】
--disable-avcodec disable libavcodec build 【包含了音视频编解码的东西,默认是开启的,肯定不能关闭掉】 (*****************************)
--disable-avformat disable libavformat build 【默认开启的,音视频封装格式的生成与解析】 
--disable-swresample disable libswresample build【对音频进行重采样的(例如:把单声道变成双声道,就需要此模块)】(************************)
--disable-swscale disable libswscale build 【如果对一个视频 放大 缩小就需要此模块】 
--disable-postproc  disable libpostproc build 【后期处理的,这个模块可以关闭掉】(************************)
--disable-avfilter disable libavfilter build 【给视频加字幕,加水印,就需要此模块】

猜你喜欢

转载自blog.csdn.net/u014078003/article/details/125017835