美文网首页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