视音频编辑器

前言

有时候我们想对音视频进行加工处理,比如视频编辑、添加字幕、裁剪等功能处理,虽然 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 命令对音视频编辑处理(已开源)相关推荐

  1. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...

    ## 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源) ## 视音频编辑器 ## 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处 ...

  2. android视频剪辑处理第三方,Android 中通过 FFmpeg 命令对音视频编辑处理

    以下文章来源于DevYk ,作者DevYK 音视频编辑器 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处理,虽然 Github 上开源了一些比较不错的项目,但是如果我们想 ...

  3. 使用FFmpeg命令处理音视频

    文章目录 前言 一.ffprobe相关命令 1.使用ffprobe查看音频文件的信息 2.使用ffprobe查看视频文件的信息 二.ffplay相关命令 1.基本的ffplay命令 2.音视频同步命令 ...

  4. Android录屏并利用FFmpeg转换成gif(三) 在Android中使用ffmpeg命令

    Android录屏并利用FFmpeg转换成gif(三) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...

  5. 音视频编解码流程与如何使用 FFMPEG 命令进行音视频处理

    一.前言 FFMPEG 是特别强大的专门用于处理音视频的开源库.你既可以使用它的 API 对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频 ...

  6. 使用FFmpeg命令实现音视频转码的备忘录

    FFmpeg是比较经典,也是比较流行的多媒体工具库(demux,mux, decode,encode等等),支持格式也比较丰富,也比较实用. 做多媒体开发的经常都需要使用到各种格式的音视频对自己的开发 ...

  7. FFmpeg command line tool(Android中使用FFmpeg命令行)

    官网地址:ffmpeg.org/ Android端,不想编译,可以直接使用ffmpeg-android-java 关于转码: 网络限制了视频传输的带宽.由于带宽限制,这就要求我们在传输之前通过实时视频 ...

  8. ffmpeg 命令_Qt音视频开发11-ffmpeg常用命令

    一.前言 大部分的格式转换工具比如格式化工厂等,都用到了ffmpeg来处理,ffmpeg编译后生成的ffmpeg.exe.ffplay.exe.ffprobe.exe等可执行文件,其实就封装了众多牛逼 ...

  9. 在Android项目中调用FFmpeg命令

    概述 FFmpeg,命令行非常强大.在PC机上,调用一行FFmpeg命令,就可以对视频文件进行剪切.合并.转码等功能.本文将介绍如何在Android中调用FFmpeg命令行. 编译 前面已经有两篇文章 ...

最新文章

  1. window 获取进程运行长
  2. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
  3. Python3.6学习笔记(三)
  4. 第一百二十六节,JavaScript,XPath操作xml节点
  5. 关于Video Renderer和Overlay Mixer
  6. 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现
  7. web前端篇:html基础知识
  8. 设计师应该知道的配色工具,有效提高效率和审美
  9. 圆弧裁剪算法c++_箍筋算法之争:按外皮长度计算与按中心线长度计算究竟相差多少?...
  10. 《EMCAScript6入门》读书笔记——2.let和const命令
  11. 好久不写日志了,现在开始,好好写了。。
  12. 学python需要什么基础-学Python需要什么基础知识?零基础可以学Python吗?
  13. c语言格式化浮点数多余的0
  14. 架构师必看-架构之美第15章伸缩性架构设计
  15. 小程序积分商城如何实现营销目的
  16. 数学作图工具_非常实用的九个程序员工具网站
  17. 【观察】嵌入式AI崛起,这里有一本通关“秘籍”
  18. 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
  19. WebViewJavascriptBridge
  20. ngx_waf 防火墙

热门文章

  1. websocket,长轮询和轮询
  2. Mac 安卓Studio使用外部模拟器
  3. UE4如何接入科大讯飞的语音识别
  4. 视觉笔记manifold(五)manifold使用小技巧
  5. 企业无线网络部署的“时”与“机”
  6. Harris角点检测原理详解
  7. plant 飞机制作小结
  8. 项目表格以及思路的设计-优惠券设计
  9. 告诉大家机器老弹出“系统检测到IP地址与网络上的其他系统有冲突...”对话框是怎么回事!
  10. 小红书信息流广告投放怎么收费?投信息流广告效果怎么样