Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)
视音频编辑器
前言
有时候我们想对音视频进行加工处理,比如视频编辑、添加字幕、裁剪等功能处理,虽然 Github 上开源了一些比较不错的项目,但是如果我们想在此项目上进行二次开发,比如我想拿到该项目的动态库基于 OpenH264 来进行对 YUV 编码,这个时候有可能该动态库没有集成 OpenH64 库,所以为了扩展性,我就自己弄了一套万能的库,基本上包含了所有常用的音视频处理库,你不用再去进行编译。
编译完成的头文件和动态库可以在该项目的 core/cpp 目录自行获取(「已完全开源」)。
❝
ps:这里再推荐一下我的另一个音视频处理库 AVEditor ----> 功能正在完善中,可以先关注 ???? 。
AVEditor 是一款短视频编辑 SDK,仿 DouYin 音视频处理。功能包含有美颜、滤镜、贴纸、特效、录制、分段录制、速率录制、变声、配乐、rtmp 直播推流、图片转视频、剪辑,mp4/flv 格式封装等功能。
❞
介绍
「视音频编辑器」 主要移植 FFmpeg v4.4-dev + libx264 + freetype + fontconfig + fribidi + openh264 +libfdk-aac + gnutls + speex + libwebp + lame +opus + opencore-amr + https
等库编译的适用于 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<AVVideo>, 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 来举例,可以看看我是如果拿到它的编译脚本.
1、先 clone RxFFmpeg
git clone https://github.com/microshow/RxFFmpeg.git
2、关联 librxffmpeg-core.so
通过该 so 我们知道它应该就是 FFmpeg 编译之后的动态库,现在我们通过 cmake 的方式关联到该 so
cmake_minimum_required(VERSION 3.4.1)
#JNI 路径
set(FFMpeg_include_PATH ${CMAKE_SOURCE_DIR})
include_directories(${FFMpeg_include_PATH}/include/)
add_library(RxFFmpeg SHARED IMPORTED)
set_target_properties(RxFFmpeg PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}/librxffmpeg-core.so)
find_library(log-liblog)
FILE(GLOB JNI_ALL_C ${JNI_PATH}/*.cpp)
add_library(ffmpeg-toolsSHARED${JNI_ALL_C}
)
target_link_libraries(ffmpeg-toolsRxFFmpeg
${log-lib}
)
3、编写 JNI 函数,拿到编译脚本
//
// Created by DevYK on 2020-10-02.
//
#include <android/log.h>
extern "C"
{
#include "libavutil/avutil.h"
}
#include <jni.h>
#define AV_TAG "AVLOG"
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, AV_TAG, format, ##__VA_ARGS__)
int JNI_OnLoad(JavaVM *javaVM, void *pVoid) {const char *config = avutil_configuration();LOGE("FFMPEG VERSION%s \n", av_version_info());LOGE("FFMPEG configuration %s \n", avutil_configuration());return JNI_VERSION_1_6;
}
通过 debug 查看 config 指针指向内存中的信息如下:
嗯,拿到了它的编译信息,然后我们就可以基于它来完善我们项目的编译,我们可以编译出比它的功能更加丰富,就如开头介绍一般,我添加了市面上常用的一些 C++ 库,基本达到了万能了吧。
总结
项目地址:AVFFmpegLib
这里就不在介绍如何编译了,感兴趣的可以看 mobile-ffmpeg 项目,我这里也是基于它进行二次封装开发。
参考
EpMedia
FFmpeg 常用命令
mobile-ffmpeg
Android 音视频编辑经验总结及开源工程分享
技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。
推荐阅读:
音视频面试基础题
OpenGL ES 学习资源分享
开通专辑 | 细数那些年写过的技术文章专辑
NDK 学习进阶免费视频来了
推荐几个堪称教科书级别的 Android 音视频入门项目
觉得不错,点个在看呗~
Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)相关推荐
- android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...
## 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源) ## 视音频编辑器 ## 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处 ...
- android视频剪辑处理第三方,Android 中通过 FFmpeg 命令对音视频编辑处理
以下文章来源于DevYk ,作者DevYK 音视频编辑器 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处理,虽然 Github 上开源了一些比较不错的项目,但是如果我们想 ...
- 使用FFmpeg命令处理音视频
文章目录 前言 一.ffprobe相关命令 1.使用ffprobe查看音频文件的信息 2.使用ffprobe查看视频文件的信息 二.ffplay相关命令 1.基本的ffplay命令 2.音视频同步命令 ...
- Android录屏并利用FFmpeg转换成gif(三) 在Android中使用ffmpeg命令
Android录屏并利用FFmpeg转换成gif(三) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...
- 音视频编解码流程与如何使用 FFMPEG 命令进行音视频处理
一.前言 FFMPEG 是特别强大的专门用于处理音视频的开源库.你既可以使用它的 API 对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频 ...
- 使用FFmpeg命令实现音视频转码的备忘录
FFmpeg是比较经典,也是比较流行的多媒体工具库(demux,mux, decode,encode等等),支持格式也比较丰富,也比较实用. 做多媒体开发的经常都需要使用到各种格式的音视频对自己的开发 ...
- FFmpeg command line tool(Android中使用FFmpeg命令行)
官网地址:ffmpeg.org/ Android端,不想编译,可以直接使用ffmpeg-android-java 关于转码: 网络限制了视频传输的带宽.由于带宽限制,这就要求我们在传输之前通过实时视频 ...
- ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令
一.前言 大部分的格式转换工具比如格式化工厂等,都用到了ffmpeg来处理,ffmpeg编译后生成的ffmpeg.exe.ffplay.exe.ffprobe.exe等可执行文件,其实就封装了众多牛逼 ...
- 在Android项目中调用FFmpeg命令
概述 FFmpeg,命令行非常强大.在PC机上,调用一行FFmpeg命令,就可以对视频文件进行剪切.合并.转码等功能.本文将介绍如何在Android中调用FFmpeg命令行. 编译 前面已经有两篇文章 ...
最新文章
- window 获取进程运行长
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
- Python3.6学习笔记(三)
- 第一百二十六节,JavaScript,XPath操作xml节点
- 关于Video Renderer和Overlay Mixer
- 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现
- web前端篇:html基础知识
- 设计师应该知道的配色工具,有效提高效率和审美
- 圆弧裁剪算法c++_箍筋算法之争:按外皮长度计算与按中心线长度计算究竟相差多少?...
- 《EMCAScript6入门》读书笔记——2.let和const命令
- 好久不写日志了,现在开始,好好写了。。
- 学python需要什么基础-学Python需要什么基础知识?零基础可以学Python吗?
- c语言格式化浮点数多余的0
- 架构师必看-架构之美第15章伸缩性架构设计
- 小程序积分商城如何实现营销目的
- 数学作图工具_非常实用的九个程序员工具网站
- 【观察】嵌入式AI崛起,这里有一本通关“秘籍”
- 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
- WebViewJavascriptBridge
- ngx_waf 防火墙
热门文章
- websocket,长轮询和轮询
- Mac 安卓Studio使用外部模拟器
- UE4如何接入科大讯飞的语音识别
- 视觉笔记manifold(五)manifold使用小技巧
- 企业无线网络部署的“时”与“机”
- Harris角点检测原理详解
- plant 飞机制作小结
- 项目表格以及思路的设计-优惠券设计
- 告诉大家机器老弹出“系统检测到IP地址与网络上的其他系统有冲突...”对话框是怎么回事!
- 小红书信息流广告投放怎么收费?投信息流广告效果怎么样