Android中通过FFmpeg命令对音视频编辑处理(已开源
视音频编辑器1、前言
有时候我们想对音视频进行加工处理,比如视频编辑、添加字幕、裁剪等功能处理,虽然Github上开源了一些比较不错的项目,但是如果我们想在此项目上进行二次开发,比如我想拿到该项目的动态库基于OpenH264来进行对YUV编码,这个时候有可能该动态库没有集成OpenH64库,所以为了扩展性,我就自己弄了一套万能的库,基本上包含了所有常用的音视频处理库,你不用再去进行编译。
编译完成的头文件和动态库可以在该项目的corecpp目录自行获取(已完全开源)。ps:这里再推荐一下我的另一个音视频处理库AVEditor功能正在完善中,可以先关注。
AVEditor是一款短视频编辑SDK,仿DouYin音视频处理。功能包含有美颜、滤镜、贴纸、特效、录制、分段录制、速率录制、变声、配乐、rtmp直播推流、图片转视频、剪辑,mp4flv格式封装等功能。
2、介绍
视音频编辑器主要移植FFmpegv4。4devlibx264freetypefontconfigfribidiopenh264libfdkaacgnutlsspeexlibwebplameopusopencoreamrhttps等库编译的适用于Android平台的音视频编辑、视频剪辑的快速处理框架,目前内置了音视频剪辑、编辑、多个视频文件合并、字幕、水印、倒放等功能,也可以传入FFmpeg命令来进行处理。
我们先来看一下内置功能的效果:
音视频剪辑:
音视频合成:
音视频编辑:
更多效果点击阅读原文进行查看
C音视频学习资料免费获取方法:关注音视频开发T哥,点击链接即可免费获取2023年最新C音视频开发进阶独家免费学习大礼包!3、如何使用3。1添加依赖implementationcom。devyk。ffmpeglib:AVFFmpegCore:1。0。13。2功能API介绍
回调处理publicinterfaceExecuteCallback{开始处理voidonStart(LongexecutionId);如果外部传递了当前操作视频的时长,那么返回的是百分比进度,反之返回的是操作视频对应的微妙时长paramvvoidonProgress(floatv);处理成功voidonSuccess(longexecutionId);处理失败voidonFailure(longexecutionId,Stringerror);取消处理voidonCancel(longexecutionId);ffmpeg执行的logvoidonFFmpegExecutionMessage(LogMessagelogMessage);}
AVEditor剪辑AVVideo:
start:开始的时间单位秒
duration:剪辑多少秒
funclip(start:Float,duration:Float)
AVEditor:
funexec(
epVideo:AVVideo,
outputOption:OutputOption,
executeCallback:ExecuteCallback)旋转AVVideo:
rotation:旋转角度(仅支持90,180,270度旋转)
isFlip:是否镜像
funrotation(rotation:Int,isFlip:Boolean)
AVEditor:
funexec(
epVideo:AVVideo,
outputOption:OutputOption,
executeCallback:ExecuteCallback)裁剪AVVideo:
width:裁剪的宽
height:裁剪的高
x:从x点开始
y:从y点开始
funcrop(
width:Float,
height:Float,
x:Float,y:Float)
AVEditor:
funexec(
epVideo:AVVideo,
outputOption:OutputOption,
executeCallback:ExecuteCallback)添加文字水印AVVideo:
funaddText(avText:AVText)
AVEditor:
funexec(
epVideo:AVVideo,
outputOption:OutputOption,
executeCallback:ExecuteCallback)添加图片水印AVVideo:
funaddDraw(epDraw:AVDraw)
AVEditor:
funexec(
epVideo:AVVideo,
outputOption:OutputOption,
executeCallback:ExecuteCallback)视频合并AVEditor:
funmerge(
epVideos:List,
outputOption:OutputOption,
executeCallback:ExecuteCallback)添加背景音乐AVEditor:
music(
videoin:String,
audioin:String,
output:String,
videoVolume:Float,
audioVolume:Float,
executeCallback:ExecuteCallback
)音视频分离AVEditor:
fundemuxer(
inSource:String,outSource:String,
format:Format,
executeCallback:ExecuteCallback)视频倒放AVEditor:
funreverse(
videoin:String,out:String,
vr:Boolean,视频是否倒放
ar:Boolean,音频是否倒放
executeCallback:ExecuteCallback)视频转图片AVEditor:
funvideo2pic(
videoin:String,视频输入文件
out:String,图片输出路径目录
w:Int,h:Int,输出图片的宽高
rate:Float,每秒视频生成图片数
executeCallback:ExecuteCallback)视频转GifAVEditor:
funvideo2Gif(
videoin:String,
gifOut:String,
startDuration:Int,
stopDuration:Int,
executeCallback:ExecuteCallback
)自定义命令AVEditor:
cmd:FFmpeg命令
duration:处理视频的时长,可以通过VideoUitls。getDuration(videoPath)来获取
funexecCmd(cmd:String,duration:Long,executeCallback:ExecuteCallback)4、FFmpeg编译小技巧
有时候我们发现Github上一些基于FFmpeg开发的比较好的项目,比如ijkplayer,RxFFmpeg等,我们想基于它做二次开发,由于我们不知道怎么编译,也不知道编译FFmpeg到底需要开启哪些节点,这个时候我就想拿某些项目的编译脚本,基于它来进行二次编译。一般来说有些项目不会开源编译FFmpeg的脚本。这个时候我们可以通过拿到开源项目的静态或者动态库,这里我就以RxFFmpeg来举例,可以看看我是如果拿到它的编译脚本。
1、先cloneRxFFmpeggitclonehttps:github。commicroshowRxFFmpeg。git
2、关联librxffmpegcore。so
通过该so我们知道它应该就是FFmpeg编译之后的动态库,现在我们通过cmake的方式关联到该socmakeminimumrequired(VERSION3。4。1)JNI路径set(FFMpegincludePATH{CMAKESOURCEDIR})includedirectories({FFMpegincludePATH}include)addlibrary(RxFFmpegSHAREDIMPORTED)settargetproperties(RxFFmpegPROPERTIESIMPORTEDLOCATION{PROJECTSOURCEDIR}。。。。。。libs{CMAKEANDROIDARCHABI}librxffmpegcore。so)findlibrary(logliblog)FILE(GLOBJNIALLC{JNIPATH}。cpp)addlibrary(ffmpegtoolsSHARED{JNIALLC})targetlinklibraries(ffmpegtoolsRxFFmpeg{loglib})
3、编写JNI函数,拿到编译脚本CreatedbyDevYKon20201002。includeexternC{includelibavutilavutil。h}includejni。hdefineAVTAGAVLOGdefineLOGE(format,。。。)androidlogprint(ANDROIDLOGERROR,AVTAG,format,VAARGS)intJNIOnLoad(JavaVMjavaVM,voidpVoid){constcharconfigavutilconfiguration();LOGE(FFMPEGVERSIONs,avversioninfo());LOGE(FFMPEGconfigurations,avutilconfiguration());returnJNIVERSION16;}
通过debug查看config指针指向内存中的信息如下:
嗯,拿到了它的编译信息,然后我们就可以基于它来完善我们项目的编译,我们可以编译出比它的功能更加丰富,就如开头介绍一般,我添加了市面上常用的一些C库,基本达到了万能了吧。5、总结
项目地址:AVFFmpegLib
这里就不在介绍如何编译了,感兴趣的可以看mobileffmpeg项目,我这里也是基于它进行二次封装开发。6、参考EpMediaFFmpeg常用命令mobileffmpegAndroid音视频编辑经验总结及开源工程分享
原文链接:Android中通过FFmpeg命令对音视频编辑处理(已开源)