通过编译ffmpeg原文件,使得ffmpeg可以在android上以命令行的形式进行运行。
最终会生成几个平台下的ffmpeg可执行文件。
Github地址
配置步骤(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
5.执行 ./android_build.sh ,会有 readlink 的问题(linux和mac不一致,但似乎不影响)
编译总结
因为该版本是linux下的版本,当时有很多环境不知道怎么装,重复编译了很多次才编译成功,走了很多的弯路,充分说明前期环境的重要性,而且每次编译花不少时间,浪费很多时间。
自己编译可以参考(没试验)
ffmpeg 瘦身
按照如上进行编译虽然可以编出android下的ffmpeg可执行文件,但是ffmpeg太大,导致apk包很大,所以要进行ffmpeg瘦身,瘦身主要是操作文件在 ffmpeg/.configure 文件,修改ffmpeg编译配置:
./configure -h 可以查看所有编译选项
ffmpeg可执行文件的大小主要来自编解码,可以通过减小编解码支持的数量达到减少执行文件的大小,
主要有 encoder,decoder,muxer,demuxer,parser这几个相对较大,先将这几个选项 disable 掉,然后enable需要的东西即可,通过 ./configure -h 命令可以查看
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