通过编译ffmpeg原文件,使得ffmpeg可以在android上以命令行的形式进行运行。 最终会生成几个平台下的ffmpeg可执行文件。

Github地址

ffmpeg命令行执行android端调用封装 >https://github.com/guardianproject/android-ffmpeg-java

ffmpeg编译 >https://github.com/WritingMinds/ffmpeg-android

配置步骤(mac环境)

1.根据github先配置环境

export ANDROID_SDK=${NDK_ROOT} linux 下

    sudo apt-get --quiet --yes install build-essential git autoconf libtool pkg-config gperf     gettext yasm python-lxml

mac 下(先安装homebrew)

    homebrew:https://brew.sh/index_zh-cn.html
    brew install wget
    brew install yasm
    brew install automake
    brew install gettext
    brew install libtool

    sudo pip2.7 install lxml (python xml解析支持)

2.之后修改 settings.sh —> $(nproc) —> 2

3.执行 ./init_update_libs.sh (下载相应的库,有些可能会下失败,需手动下载,如libpng-1.6.21)

4.重新下载freetype2 2.4.6版本替换文件夹下的freetype2

freetype下载:https://www.freetype.org/download.html

编译总结

因为该版本是linux下的版本,当时有很多环境不知道怎么装,重复编译了很多次才编译成功,走了很多的弯路,充分说明前期环境的重要性,而且每次编译花不少时间,浪费很多时间。

自己编译可以参考(没试验)

http://vinsol.com/blog/2014/07/30/cross-compiling-ffmpeg-with-x264-for-android/

ffmpeg 瘦身

按照如上进行编译虽然可以编出android下的ffmpeg可执行文件,但是ffmpeg太大,导致apk包很大,所以要进行ffmpeg瘦身,瘦身主要是操作文件在 ffmpeg/.configure 文件,修改ffmpeg编译配置:

./configure -h 可以查看所有编译选项

ffmpeg可执行文件的大小主要来自编解码,可以通过减小编解码支持的数量达到减少执行文件的大小,

主要有 encoder,decoder,muxer,demuxer,parser这几个相对较大,先将这几个选项 disable 掉,然后enable需要的东西即可,通过 ./configure -h 命令可以查看

root@web ffmpeg]# ./configure --help
Usage: configure [options]
Options: [defaults in brackets after descriptions]

Standard options: 基本选项参数
--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-x264            启用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]

Advanced options (experts only): 高级选项参数(供专业人员使用)
--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           enable 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

ffmpeg 相关参考文档:

滤镜中文解释文档:http://www.cnblogs.com/xdsnet/p/5196596.html
ffmpeg基础:https://wenku.baidu.com/view/296eefcaf90f76c661371af1.html
特效合成:https://segmentfault.com/q/1010000002783684
ffmpeg相关属性解释:http://ffmpeg.org/ffmpeg-utils.html#Expression-Evaluation

ffmpeg 简要命令如下:

制作 fade in/out 特效视频
ffmpeg -r 1/5 -i in%03d.jpg -c:v libx264 -r 30 -y -pix_fmt yuv420p slide.mp4
ffmpeg -i slide.mp4 -y -vf fade=in:0:30 slide_fade_in.mp4
ffmpeg -i slide_fade_in.mp4 -y -vf fade=out:120:30 slide_fade_in_out.mp4

=========================================================================================================================================

ffmpeg -loop 1 -t 5 -i in001.jpg -loop 1 -t 5 -i in002.jpg -loop 1 -t 5 -i in003.jpg -loop 1 -t 5 -i in004.jpg -loop 1 -t 5 -i in005.jpg -filter_complex "[0:v]fade=t=out:st=4:d=1[v0]; [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4



## 倒影
ffmpeg -i in001.jpg -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" out001.jpg
ffmpeg -i out.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" split_slide.mp4


ffmpeg -i in002.mp4 -i in003.mp4 -filter_complex "blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))'" aa.mp4

ffmpeg -i in002.mp4 -i in003.mp4 -filter_complex "blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)'" aa.mp4

ffmpeg -i in002.mp4 -i in003.mp4 -filter_complex "blend=all_expr='if(gt(X,Y*(W/H)),A,B)'" aa.mp4

ffmpeg -i in002.mp4 -vf "scale=w=iw:h=-1:eval=frame" aa.mp4

## 图片到视屏
ffmpeg -loop 1 -t 10 -i in003.jpg -vcodec mpeg4 in003.mp4

## 旋转
ffmpeg -i in002.mp4 -vf "rotate='2*PI*t/10'" aa.mp4

## 缩放
ffmpeg -loop 1 -i in001.jpg -vf "zoompan=z='if(lte(zoom,0.5),1.5,max(0.5,zoom-0.15))':d=125" -c:v libx264 -t 5 aa.mp4

ffmpeg -r 25 -i in001.jpg -filter_complex "scale=-1:10*ih,zoompan=z='min(zoom+0.0015,1.5)':d=125:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',scale=-1:720"  -y -shortest -c:v libx264 -pix_fmt yuv420p aa.mp4


ffmpeg -i in001.jpg -filter_complex "scale=-1:10*ih,zoompan=z='min(zoom+0.005,3)':d=125:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'[z];[z][0]scale2ref[out][ref];[ref]nullsink" -map "[out]"  -y aa.mp4


ffmpeg -i in002.mp4 -i frame.ts -filter_complex "nullsrc=size=200x100 [background];[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];[background][left] overlay=shortest=1  [background+left];[background+left][right] overlay=shortest=1:x=100" aa.mp4


 ffmpeg -y -loop 1 -i in001.jpg -loop 1 -i in002.jpg -loop 1 -i in003.jpg -filter_complex "[0:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,fade=t=in:st=0:d=0.5,fade=t=out:st=4.5:d=0.5,scale=796x450,setpts=PTS-STARTPTS[v0];[1:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,fade=t=in:st=0:d=0.5,fade=t=out:st=4.5:d=0.5,scale=796x450,setpts=PTS-STARTPTS[v1];[2:v]zoompan=z='min(zoom+0.0015,1.5)':d=125,trim=duration=5,fade=t=in:st=0:d=0.5,fade=t=out:st=4.5:d=0.5,scale=796x450,setpts=PTS-STARTPTS[v2]; [v0][v1][v2] concat=n=3:v=1:a=0, format=yuv420p[v]" -map '[v]' -c:v libx264 -pix_fmt yuvj420p -q:v 1 test.mp4

 ffmpeg -i in002.jpg -filter_complex "nullsrc=s=1000*800 [bg]; scale=100*100 [vvv];[bg][vvv] overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" -t 10 abc.mp4


http://stackoverflow.com/questions/29845019/ffmpeg-convert-a-series-of-images-to-video-with-crossfade-or-any-other-transit