android编译FFmpeg编译选项的命令详解

2019-09-04 16:43:16

参考地址 Android FFMpeg(一)——编译FFmpeg

第一步 下载FFmpeg(F F m peg)。 

第二步 解压FFmpeg。 

第三步 windows安装MinGW和Msys。也许还要yasm,名字改为yasm.exe放到C:\WINDOWS\system32中。Linux下就不用这么麻烦了。 

第四步 建立如下目录结构,ffmpeg为解压出来的FFmpeg。configure为ffmpeg中copy出来的。 



第五步 修改 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)'  

1

2

3

4

为:


SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  

SLIB_INSTALL_LINKS='$(SLIBNAME)'  

1

2

3

4

第六步 修改build_all.sh内容为:


cd ffmpeg   #进入ffmpeg目录


# do not perform 'make clean' at the first time

if [ -f config.mak ]    #判断config.mak是否存在,不存在表示第一次执行,避免clean报错

then

make clean

fi

# Windows环境下,可以在Msys中用mount查看各个硬盘的挂载点。Linux下就更容易了。

export NDK=/c/Android/android-sdk/ndk-bundle    #ndk路径

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt  

export PLATFORM=$NDK/platforms/android-24/arch-arm  

export PREFIX=../build  #生成文件的路径

export OS=windows-x86_64

build_one(){  #configure的各种参数设置了,需要用到什么就编译什么,不必要的禁止掉

  ./configure --target-os=linux \

  --prefix=$PREFIX \

  --libdir=$PREFIX/lib \

  --shlibdir=$PREFIX/shlib \

  --incdir=$PREFIX/include \

  --mandir=$PREFIX/share/man \

  --bindir=$PREFIX/bin \

  --datadir=$PREFIX/share/ffmpeg \

  --docdir=$PREFIX/share/doc/ffmpeg \

  --enable-cross-compile \

  --enable-runtime-cpudetect \

  --disable-asm \

  --arch=arm \

  --cc=$PREBUILT/$OS/bin/arm-linux-androideabi-gcc \

  --cross-prefix=$PREBUILT/$OS/bin/arm-linux-androideabi- \

  --disable-stripping \

  --nm=$PREBUILT/$OS/bin/arm-linux-androideabi-nm \

  --sysroot=$PLATFORM \

  --enable-gpl \

  --enable-shared \

  --disable-static \

  --enable-small \

  --disable-ffprobe \

  --disable-ffplay \

  --disable-ffmpeg \

  --disable-ffserver \

  --disable-debug \

  --extra-libs=-lgcc \

  --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"

}  


build_one  

# 过程可能长点  

make  

make install

# 清除临时文件

make clean  

# out

cd .. 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

第七步 Windows下,打开Msys,进入第四步中的目录,执行bash。


./build_all.sh 

1

Linux直接进入第四步中的目录,执行。


至此,不出意外在build\shlib下就编译出FFmpeg的so库了。但是,并不是这样就算完了。FFmpeg只是一个框架,实际上进行各种格式的编解码的是依靠其他库来完成的。


附:FFmpeg 编译选项 (内容来自http://www.cnblogs.com/wainiwann/p/4204230.html)


--help          print this message //帮助

--logfile=FILE    //测试和输出到文件记录

--disable-logging   //不要日志调试的信息

--prefix=PREFIX    //安装的目录前缀

--bindir=DIR       //生成2进制文件的目录

--datadir=DIR      //生成数据文件目录

--libdir=DIR       //生成静态库的目录

--shlibdir=DIR     //生成动态库的目录

--incdir=DIR       //生成头文件的目录

--mandir=DIR       //生成帮助手册的目录


Configuration options:

--disable-static       //不建立静态库

--enable-shared        // 建立共享库

--enable-gpl           //允许GPL代码 生成在lib 和2进制文件            

--enable-nonfree       //允许nonfree代码生成lib 和2进制文件

--disable-ffmpeg       //取消建立ffmpeg

--disable-ffplay     

--disable-ffserver         

--enable-postproc       //使GPled后置处理支持        

--enable-avfilter   //视频过滤支持

--enable-avfilter-lavf  //依赖avformat过滤器

--enable-beosthreads  //使用BeOS线程                            

--enable-os2threads     //使用OS/2线程

--enable-pthreads        use pthreads [no]   

--enable-w32threads      use Win32 threads [no]                              //win32

--enable-x11grab         enable X11 grabbing 

--disable-network        //禁用网络支持                     

--disable-ipv6           //禁用ipv6支持

--disable-mpegaudio-hp   //快(但不准确)的音频解码

--enable-gray            //全灰度支持(慢,颜色)    

--disable-swscale-alpha  //禁止alpha管道在swscale的支持

--disable-fastdiv        //禁用table-based的分工

--enable-small          //优化尺寸代替速度

--disable-aandct        //禁用AAN dct编码

--disable-fft           //禁用FFT代码

--disable-golomb         //禁用Golomb代码

--disable-mdct          //取消MDCT代码

--disable-rdft          //取消RDFT代码

--enable-runtime-cpudetect //使能CPU运行时检测(会生成更大的2进制)

--enable-hardcoded-tables //使用编码表替换运行时产生

--enable-memalign-hack  //模仿memalign影响记忆的调试器

--enable-beos-netserver   //使用beos netserver

--disable-encoder=NAME  //禁用编码器

--enable-encoder=NAME   //使用编码器

--disable-encoders      //禁用所有编码器

--disable-decoder=NAME  //禁用解码器

--enable-decoder=NAME   //使用解码器

--disable-decoders      //禁用所有解码器

--disable-hwaccel=NAME  //禁用hwaccel

--enable-hwaccel=NAME   //启用hwaccel名字

--disable-hwaccels      //禁用所有hwaccel        

--disable-muxer=NAME     //禁用合成器

--enable-muxer=NAME      //启用合成器

--disable-muxers         //禁用所有合成器

--disable-demuxer=NAME   //禁用分离器

--enable-demuxer=NAME    //启用分离器

--disable-demuxers       //禁用所有分离器

--enable-parser=NAME     //启用解析器

--disable-parser=NAME    //禁用解析器

--disable-parsers        //禁用所有解析器

--enable-bsf=NAME        //启用数据流过滤器

--disable-bsf=NAME       //禁用数据过滤器

--disable-bsfs           //禁用所有数据过滤器名字

--enable-protocol=NAME   //启用协议

--disable-protocol=NAME  //禁用协议               

--disable-protocols      //禁用所有协议

--disable-indevs         //禁用输入设备                                            

--disable-outdevs        //禁用输出设备

--disable-devices        //禁用所有设备

--enable-filter=NAME     //启用过滤器

--disable-filter=NAME    //禁用过滤器

--disable-filters        //禁用所有过滤器

--list-decoders          //显示所有可用的解码器

--list-encoders          //显示所有可用的编码器

--list-hwaccels          //显示所有可用的硬件加速器            

--list-muxers            //显示所有可用的合成器                       

--list-demuxers          //显示所有可用的分离器

--list-parsers           //显示所有可用的的解析器

--list-protocols         //显示所有可用的协议                       

--list-bsfs              //显示所有可用的数据过滤器              

--list-indevs            //显示所有可用的输入设备

--list-outdevs           //显示所有可用的输出设备

--list-filters           //显示所有可用的过滤器


External library support:   外部库的支持

--enable-avisynth       //使阅读AVISYnth脚本文件           

--enable-bzlib          //设置bzuilb(自动检测)

--enable-libamr-nb      //设置libamr-nb浮点音频解码

--enable-libamr-wb      //设置libamr-wb浮点音频解码

--enable-libdc1394       enable IIDC-1394 grabbing using libdc1394 and libraw1394 [no]

--enable-libdirac        enable Dirac support via libdirac [no]

--enable-libfaac         enable FAAC support via libfaac [no]

--enable-libfaad         enable FAAD support via libfaad [no]

--enable-libfaadbin      open libfaad.so.0 at runtime [no]

--enable-libgsm          enable GSM support via libgsm [no]

--enable-libmp3lame      enable MP3 encoding via libmp3lame [no]

--enable-libnut          enable NUT (de)muxing via libnut,

                            native (de)muxer exists [no]

--enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]

--enable-libschroedinger enable Dirac support via libschroedinger [no]

--enable-libspeex        enable Speex decoding via libspeex [no]

--enable-libtheora       enable Theora encoding via libtheora [no]

--enable-libvorbis       enable Vorbis encoding via libvorbis,

                         native implementation exists [no]

--enable-libx264         enable H.264 encoding via x264 [no]

--enable-libxvid         enable Xvid encoding via xvidcore,

                         native MPEG-4/Xvid encoder exists [no]

--enable-mlib            enable Sun medialib [no]

--enable-zlib            enable zlib [autodetect]


Advanced options (experts only):高级的选项

--source-path=PATH       //源代码路径

--cross-prefix=PREFIX    //作为编译工具使用的前缀                            

--enable-cross-compile   //假设交叉编译的使用                                

--sysroot=PATH           //root of cross-build tree 

--sysinclude=PATH        //cross—build系统位置的标题

--target-os=OS           //目标OS,默认linux

--target-exec=CMD        //编译器目标OS(linux)

--target-path=DIR        //path to view of build directory on target  

--nm=NM                  //使用um工具                  

--as=AS                  //使用汇编语言AS                                                       

--cc=CC                  //用c编译器cc                                     

--host-cc=HOSTCC         //  使用主机C编译器hostcc                                    

--host-cflags=HCFLAGS    //use HCFLAGS when compiling for host                             

--host-ldflags=HLDFLAGS  //当链接主机的时候使用libs库                     

--host-libs=HLIBS        //lib时使用HLIBS主机链接                    

--extra-cflags=ECFLAGS   //add ECFLAGS to CFLAGS [ -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112] 

--extra-ldflags=ELDFLAGS //附加flag                         

--extra-libs=ELIBS       //附加库

--extra-version=STRING   //版本字符串后缀

--build-suffix=SUFFIX    //库名字后缀                          

--arch=ARCH              //选择平台

--cpu=CPU                //选择最低需要cpu(影响指令的选择可能坠毁在更老的cpu)

--enable-powerpc-perf    //设置绩效报告的ppc(需要使用pmc)

--disable-altivec        //禁用Altivec优化

--disable-amd3dnow       //禁用3DNOW优化

--disable-amd3dnowext    //禁用3DNOW扩展优化

--disable-mmx            //禁用MMX优化

--disable-mmx2           //禁用MMX2优化

--disable-sse            //禁用SSE优化

--disable-ssse3          //禁用SSSE3优化

--disable-armv5te        //禁用armv5te优化,下同

--disable-armv6          

--disable-armv6t2        

--disable-armvfp         

--disable-iwmmxt         

--disable-mmi            

--disable-neon           

--disable-vis            

--disable-yasm           //禁用汇编指令                  


Developer options (useful when working on FFmpeg itself): 

--disable-debug          disable debugging symbols  //禁止调试

--enable-debug=LEVEL     set the debug level [] //设置调试等级

--enable-gprof           enable profiling with gprof [] //设置剖析和性能分析

--disable-optimizations  disable compiler optimizations //禁用编译器优化选项

--enable-extra-warnings  enable more compiler warnings  //使更多的编译器选项

--disable-stripping  //禁用剥夺可执行文件和共享库



  • 2021-02-03 16:58:39

    iOS静态库与动态库的区别与打包

    这篇主要是记录一下 iOS 下静态库与动态库的打包流程,以便以后用到时快速查阅,供自己也供大家学习记录。同时也简述了一下 动态库 与 静态库 的区别。

  • 2021-02-03 16:59:59

    iOS 静态库和动态库全分析

    库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

  • 2021-02-03 17:01:30

    iOS库 .a与.framework区别

    静态库:连接时完整地拷贝至可执行文件中,被屡次使用就有多份冗余拷贝。 动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

  • 2021-02-03 17:13:58

    iOS - 封装静态库

    静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝,.a的静态库 .framework的静态库

  • 2021-02-03 17:16:07

    iOS 中的动态库、静态库和 framework

    首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。

  • 2021-02-03 17:17:53

    iOS 同一个工程下打包不同的app

    应用图标,启动画面,应用启动后的首页都不一样。 有些课程(例如公务员考试和高考)是有目标考试的概念,不同的目标考试大纲是不一样的。拿高考来举例,北京的高考和上海的高考,就有着完全不一样的考试大纲。高考的文科和理科,又有着完全不同的考试科目。 有些课程会有一些自定义的界面,例如高考的应用可以设置昵称,有些课程的真题练习中是有推荐真题模块的,而有些课程又没有。 有些课程有扫描答题卡功能,有些课程有考前冲刺功能,有些课程有大题专项查看功能,而有些课程又没有上述功能。另外还有一些微小细节,但是解决方法和类似,所以就不一一展开说明。

  • 2021-02-04 14:02:30

    window软件界面找不到了跑到屏幕外面去了

    一般可以这样操作,按Alt+空格,然后按M,然后用上下左右键把窗口移动到能看到的地方,再按回车。有些第三方的软件可能不能用,大部分都可以这样做。

  • 2021-02-04 14:08:13

    基于 Electron 的爬虫框架 Nightmare

    Electron 可以让你使用纯 JavaScript 调用 Chrome 丰富的原生的接口来创造桌面应用。你可以把它看作一个专注于桌面应用的 Node.js 的变体,而不是 Web 服务器。其基于浏览器的应用方式可以极方便的做各种响应式的交互,接下来介绍下关于 Electron 上衍生出的框架 Nightmare

  • 2021-02-04 20:13:02

    iOS framework制作及使用(包含xib和图片)

    静态库与动态库简介: 静态库:链接使用时完整地拷贝至可执行文件中 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次 本文制作framework对应xcode版本:10.1