美文网首页Android音视频系列
FFmpeg——自己动手编译FFmpeg

FFmpeg——自己动手编译FFmpeg

作者: Peakmain | 来源:发表于2019-10-24 12:16 被阅读0次

    配置ndk环境

    • 输入命令查看有没有配置
    vim /etc/profile
    
    • 下载 ndk 版本推荐16以上。Mac的使用Mac的ndk,Linux用Linux的

    • 下载 FFmpeg,这里使用的是3.3.9

    • sudo vim etc/profile设置ndk路径

      # 配置NDK路径
     export NDK_PATH=/Users/admin/Desktop/android-ndk-r16b
     export PATH=$NDK_PATH:$PATH
    
    • 退出:wq!
    • 查看命令
    source /etc/profile
     echo $NDK_PATH
    
    • 16以上的版本需要我们自己生成Android版本交叉编译链
      解压ndk在ndk下新建一个目录android-toolchains/android-19


      image.png

    随后命令进入到build/tools敲下面代码

     sudo ./make_standalone_toolchain.py --arch arm --api 19 --install-dir /Users/admin/Desktop/android-ndk-r16b/android-toolchains/android-19/arch-arm
    

    手写ffmepg编译脚本

    • FFmpeg 直接解压到工作目录下


      image.png
    • 看下README.md有没有编译的教程
    • 已经有了Makefile,make编译一下试试


      image.png
    • 报错需要解决,报错的原因是Makefile配置文件没生成,所以需要运行configure文件
    ./configure
    
    image.png
    • 生成配置文件之后,再次运行make,但是编译后的文件只能在当前类型系统运行
    • 如果想在android或者iOS运行都需要交叉编译动态,因此我们一般都需要往configure文件里面传一些脚超编译参数
    • 查看configure帮助方法
    ./configure --help > configure_help.txt
    
    FFmpeg 编译参数详解:
    --help
    显示此帮助信息|print this message
    
    --log[=FILE|yes|no]
    记录测试并输出到config.err文件|log tests and output to FILE [config.err]
    
    --prefix=PREFIX
    安装程序到指定目录(默认/usr/local)|install in PREFIX [/usr/local]
    
    --libdir=DIR
    安装库到指定目录(默认prefix/lib)|install libs in DIR [PREFIX/lib]
    
    --shlibdir=DIR
    指定共享库路径(默认prefix/lib)|install shared libs in DIR [PREFIX/lib]
    
    --incdir=DIR
    指定includes路径(默认prefix/include/ffmpeg)|install includes in DIR[PREFIX/include/ffmpeg]
    
    --mandir=DIR
    指定man page路径(默认prefix/man)install man page in DIR [PREFIX/man]
    
    --enable-mp3lame
    启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]
    
    --enable-libogg
    启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]
    
    --enable-vorbis
    启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]
    
    --enable-faad
    启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]
    
    --enable-faadbin
    启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]
    
    --enable-faac
    启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]
    
    --enable-libgsm
    启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]
    
    --enable-xvid
    启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]
    
    --enable-libx264
    启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]
    
    --enable-mingw32
    启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile
    
    --enable-mingwce
    启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile
    
    --enable-a52
    启用A52支持(默认关闭)enable GPLed A52 support [default=no]
    
    --enable-a52bin
    启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]
    
    --enable-dts
    启用DTS支持(默认关闭)enable GPLed DTS support [default=no]
    
    --enable-pp
    启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]
    
    --enable-static
    构建静态库(默认启用)build static libraries [default=yes]
    
    --disable-static
    禁止构建静态库(默认关闭)do not build static libraries [default=no]
    
    --enable-shared
    构建共享库(默认关闭)build shared libraries [default=no]
    
    --disable-shared
    禁止构建共享库(默认启用)do not build shared libraries [default=yes]
    
    --enable-amr_nb
    启用amr_nb float音频编解码器|enable amr_nb float audio codec
    
    --enable-amr_nb-fixed
    启用fixed amr_nb codec | use fixed point for amr-nb codec
    
    --enable-amr_wb
    启用amr_wb float音频编解码器|enable amr_wb float audio codec
    
    --enable-amr_if2
    启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec
    
    --enable-sunmlib
    启用Sun medialib(默认关闭)| use Sun medialib [default=no]
    
    --enable-pthreads
    启用pthreads(多线程)(默认关闭)use pthreads [default=no]
    
    --enable-dc1394
    启用libdc1394、libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]
    
    --enable-swscaler
    启用计数器支持?(默认关闭)software scaler support [default=no]
    
    --enable-avisynth
    允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth script files [default=no]
    
    --enable-gpl
    允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no]
    
    --source-path=PATH
    源码的路径(当前为/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
    
    --cross-prefix=PREFIX
    为编译工具指定路径 | use PREFIX for compilation tools []
    
    --cross-compile
    假定使用了交叉编译 | assume a cross-compiler is used
    
    --cc=CC
    指定使用何种C编译器(默认gcc)use C compiler CC [gcc]
    
    --make=MAKE
    使用特定的make | use specified make [make]
    
    --extra-cflags=ECFLAGS
    添加ECFLAGS到CFLAGS | add ECFLAGS to CFLAGS []
    
    --extra-ldflags=ELDFLAGS
    添加ELDFLAGS到LDFLAGS(默认-Wl,--as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,--as-needed]
    
    --extra-libs=ELIBS
    添加ELIBS | add ELIBS []
    
    --build-suffix=SUFFIX
    为专用程序添加后缀 | suffix for application specific build []
    
    --arch=ARCH
    选择机器架构(默认x86)select architecture [x86]
    
    --cpu=CPU
    选用最低的cpu(影响指令的选择,可以在老CPU上出错)| selects the minimum cpu required (affects instruction selection, may crash on older CPUs)
    
    --powerpc-perf-enable
    启用PPC上面的性能报告(需要启用PMC)enable performance report on PPC(requires enabling PMC)
    
    --disable-mmx
    禁用MMX | disable MMX usage
    
    --disable-armv5te
    禁用armv5te | disable armv5te usage
    
    --disable-iwmmxt
    禁用iwmmxt | disable iwmmxt usage
    
    --disable-altivec
    禁用AltiVec | disable AltiVec usage
    
    --disable-audio-oss
    禁用OSS音频支持(默认启用)disable OSS audio support [default=no]
    
    --disable-audio-beos
    禁用BeOS音频支持(默认启用)disable BeOS audio support [default=no]
    
    --disable-v4l
    禁用video4linux提取(默认启用)disable video4linux grabbing [default=no]
    
    --disable-v4l2
    禁用video4linux2提取(默认启用)disable video4linux2 grabbing [default=no]
    
    --disable-bktr
    禁用bktr视频提取(默认启用)disable bktr video grabbing [default=no]
    
    --disable-dv1394
    禁用DV1394提取(默认启用)disable DV1394 grabbing [default=no]
    
    --disable-network
    禁用网络支持(默认支持)disable network support [default=no]
    
    --disable-ipv6
    禁用ipv6支持(默认支持)disable ipv6 support [default=no]
    
    --disable-zlib
    禁用zlib(默认支持)disable zlib [default=no]
    
    --disable-simple_idct
    禁用simple IDCT例程(默认启用)disable simple IDCT routines [default=no]
    
    --disable-vhook
    禁用video hooking支持| disable video hooking support
    
    --enable-gprof
    启用profiling with gprof [no]
    
    --disable-debug
    禁用调试符号 | disable debugging symbols
    
    --disable-opts
    禁用编译器最优化 | disable compiler optimizations
    
    --disable-mpegaudio-hp
    启用更快的解码MPEG音频(但精确度较低)(默认禁用)faster (but less accurate) MPEG audio decoding [default=no]
    
    --disable-protocols
    禁用 I/O 协议支持(默认启用)disable I/O protocols support [default=no]
    
    --disable-ffserver
    禁用生成ffserver | disable ffserver build
    
    --disable-ffplay
    禁用生成ffplay | disable ffplay build
    
    --enable-small
    启用优化文件尺寸大小(牺牲速度)optimize for size instead of speed
    
    --enable-memalign-hack
    启用模拟内存排列,由内存调试器干涉? | emulate memalign, interferes with memory debuggers
    
    --disable-strip
    禁用剥离可执行程序和共享库 | disable stripping of executables and shared libraries
    
    --disable-encoder=NAME
    禁用XX编码器 | disables encoder NAME
    
    --enable-encoder=NAME
    启用XX编码器 | enables encoder NAME
    
    --disable-decoder=NAME
    禁用XX解码器 | disables decoder NAME
    
    --enable-decoder=NAME
    启用XX解码器 | enables decoder NAME
    
    --disable-encoders
    禁用所有编码器 | disables all encoders
    
    --disable-decoders
    禁用所有解码器 | disables all decoders
    
    --disable-muxer=NAME
    禁用XX混音器 | disables muxer NAME
    
    --enable-muxer=NAME
    启用XX混音器 | enables muxer NAME
    
    --disable-muxers
    禁用所有混音器 | disables all muxers
    
    --disable-demuxer=NAME
    禁用XX解轨器 | disables demuxer NAME
    
    --enable-demuxer=NAME
    启用XX解轨器 | enables demuxer NAME
    
    --disable-demuxers
    禁用所有解轨器 | disables all demuxers
    
    --enable-parser=NAME
    启用XX剖析器 | enables parser NAME
    
    --disable-parser=NAME
    禁用XX剖析器 | disables parser NAME
    
    --disable-parsers
    禁用所有剖析器 | disables all parsers
    
    • 写一个 build.sh 脚本来执行 ./configure 脚本文件
    # 用于编译 android 平台的脚本
    #!/bin/bash
    . /etc/profile
    
    # 定义几个变量
    ARCH=arm
    CPU=armv7-a
    PREFIX=$(pwd)/android/$ARCH/$CPU
    ANDROID_TOOLCHAINS_PATH=$NDK_PATH/android-toolchains/android-19/arch-arm
    CROSS_PREFIX=$ANDROID_TOOLCHAINS_PATH/bin/arm-linux-androideabi-
    SYSROOT=$ANDROID_TOOLCHAINS_PATH/sysroot
    
     build(){
        # 执行 .configure 文件
        ./configure --prefix=${PREFIX} \
        --enable-gpl \
        --disable-static \
        --enable-shared \
        --enable-small \
        --disable-programs \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-doc \
        --arch=$ARCH \
        --cpu=$CPU \
        --cross-prefix=${CROSS_PREFIX} \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --target-os=linux \
        --extra-cflags="-fpic" \
     
        # makefile 清除,就是执行了 makefile 文件里面的 clean 命令
        make clean
        # 运行 Makefile
        make
        # 安装到指定 prefix 目录下
        make install
        # make clean
    }
    
    
    
    # 执行 build 函数
    build
    
    # 下面需要再编译其他的
    # 需要重新设置参数
    # CPU=NAME
    # build
    

    ffmpeg-3.3.9/android/arm/armv7-a/lib得到如下图


    image.png

    发现编译出来是 linux 的命名方式,因此我们需要在 configure 中改一下生成文件名的格式

    • 修改.configure文件
    # 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)'
    
    image.png

    如何适配so架构

    • 目前支持的有不同的七种cpu架构:
      ARMv5,ARMv7(2010),x86(2011),mips(2012),ARMv8,mips64,x86-64。每一种架构都关联着一个ABI
    • armv5,armv7,armv8:高版本会适配低版本,因此只要放个低版本就可以了,一般使用armeabi或者armeabi-v7a(更推荐)
    • armeabi:v5因为比较旧,因此早期缺少浮点计算的硬件支持,在需要大量计算的时候会有影响

    相关文章

      网友评论

        本文标题:FFmpeg——自己动手编译FFmpeg

        本文链接:https://www.haomeiwen.com/subject/acbkvctx.html