Android 中通过 FFmpeg 命令对音视频编辑处理

以下文章来源于DevYk, 作者DevYK
音视频编辑器前言有时候我们想对音视频进行加工处理 , 比如视频编辑、添加字幕、裁剪等功能处理 , 虽然 Github 上开源了一些比较不错的项目 , 但是如果我们想在此项目上进行二次开发 , 比如我想拿到该项目的动态库基于 OpenH264 来进行对 YUV 编码 , 这个时候有可能该动态库没有集成 OpenH64 库 , 所以为了扩展性 , 我就自己弄了一套万能的库 , 基本上包含了所有常用的音视频处理库 , 你不用再去进行编译 。
编译完成的头文件和动态库可以在该项目的 core/cpp 目录自行获取(「已完全开源」) 。
介绍「视音频编辑器」 主要移植 FFmpeg v4.4-dev + libx264 + freetype + fontconfig + fribidi + openh264 +libfdk-aac + gnutls + speex + libwebp + lame +opus + opencore-amr + https 等库编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架 , 目前内置了音视频剪辑、编辑、多个视频文件合并、字幕、水印、倒放等功能 , 也可以传入 「FFmpeg」 命令来进行处理 。
「我们先来看一下内置功能的效果:」
音视频剪辑:
Android 中通过 FFmpeg 命令对音视频编辑处理文章插图
音视频合成:
音视频编辑:
如何使用1. 添加依赖
implementation 'com.devyk.ffmpeglib:AVFFmpegCore:1.0.1'2. 功能 API 介绍
「回调处理」
public interface ExecuteCallback {/***开始处理*/void onStart(Long executionId);/*** 如果外部传递了当前操作视频的时长 , 那么返回的是百分比进度 , 反之返回的是操作视频对应的微妙时长** @param v*/void onProgress(float v);/***处理成功*/void onSuccess(long executionId);/***处理失败*/void onFailure(long executionId, String error);/***取消处理*/void onCancel(long executionId);/*** ffmpeg 执行的 log*/void onFFmpegExecutionMessage(LogMessage logMessage);}「AVEditor」

  • 剪辑:
AVVideo://start:开始的时间 单位秒//duration: 剪辑多少秒fun clip(start: Float, duration: Float)AVEditor:fun exec( epVideo: AVVideo,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 旋转:
AVVideo://rotation:旋转角度(仅支持90,180,270度旋转)//isFlip:是否镜像fun rotation(rotation: Int, isFlip: Boolean)AVEditor:fun exec( epVideo: AVVideo,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 裁剪:
AVVideo://width: 裁剪的宽//height: 裁剪的高//x: 从 x 点开始//y: 从 y 点开始fun crop( width: Float,height: Float,x: Float, y: Float)AVEditor:fun exec( epVideo: AVVideo,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 添加文字水印:
AVVideo:fun addText(avText: AVText)AVEditor:fun exec( epVideo: AVVideo,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 添加图片水印:
AVVideo:fun addDraw(epDraw: AVDraw)AVEditor:fun exec( epVideo: AVVideo,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 视频合并:
AVEditor:fun merge( epVideos: List,outputOption: OutputOption,executeCallback: ExecuteCallback)
  • 添加背景音乐:
AVEditor:music( videoin: String, audioin: String, output: String, videoVolume: Float, audioVolume: Float, executeCallback: ExecuteCallback )
  • 音视频分离:
AVEditor:fun demuxer( inSource: String, outSource: String,format: Format,executeCallback: ExecuteCallback)
  • 视频倒放:
AVEditor:fun reverse( videoin: String, out: String,vr: Boolean,//视频是否倒放 ar: Boolean, //音频是否倒放 executeCallback: ExecuteCallback)
  • 视频转图片:
AVEditor:fun video2pic( videoin: String, //视频输入文件out: String, //图片输出路径-目录 w: Int, h: Int, //输出图片的宽高 rate: Float, //每秒视频生成图片数 executeCallback: ExecuteCallback)
  • 视频转 Gif:
AVEditor:fun video2Gif( videoin: String, gifOut: String, startDuration: Int, stopDuration: Int, executeCallback: ExecuteCallback )
  • 自定义命令:
AVEditor://cmd:FFmpeg 命令//duration: 处理视频的时长 , 可以通过 VideoUitls.getDuration(videoPath) 来获取fun execCmd(cmd: String, duration: Long, executeCallback: ExecuteCallback)
FFmpeg 编译小技巧有时候我们发现 Github 上一些基于 FFmpeg 开发的比较好的项目 , 比如 ijkplayer, RxFFmpeg 等 , 我们想基于它做二次开发 , 由于我们不知道怎么编译 , 也不知道编译 FFmpeg 到底需要开启哪些节点 , 这个时候我就想拿某些项目的编译脚本 , 基于它来进行二次编译 。 一般来说有些项目不会开源编译 FFmpeg 的脚本 。 这个时候我们可以通过拿到开源项目的静态或者动态库 , 这里我就以 RxFFmpeg 来举例 , 可以看看我是如果拿到它的编译脚本.