• Stars
    star
    111
  • Rank 313,360 (Top 7 %)
  • Language
    C
  • Created about 4 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

移植 FFmpeg 最新版本v4.4-dev-416 + libx264 + freetype + fontconfig + fribidi + openh264 +libfdk-aac + gnutls + speex + libwebp + lame +opus + opencore-amr + https)编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架,目前内置了音视频剪辑、编辑、视频拼接、字幕、水印、倒放等功能,也可以根据 ffmpeg 命令模式来进行处理。

视音频编辑器

前言

有时候我们想对音视频进行加工处理,比如视频编辑、添加字幕、裁剪等功能处理,虽然 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 命令来进行处理。

我们先来看一下内置功能的效果:

视频剪辑:

视频合并:

视频编辑:

如何使用

###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 开发的比较好的项目,比如 ijkplayerRxFFmpeg 等,我们想基于它做二次开发,由于我们不知道怎么编译,也不知道编译 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-lib
        log)
FILE(GLOB JNI_ALL_C ${JNI_PATH}/*.cpp)
add_library(
        ffmpeg-tools
        SHARED
        ${JNI_ALL_C}
)
target_link_libraries(
        ffmpeg-tools
        RxFFmpeg
${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 项目,我这里也是基于它进行二次封装开发。

##参考

More Repositories

1

Blog

Android 面试宝典、数据结构和算法、音视频 (FFmpeg、AAC、x264、MediaCodec)、 C/C++ 、OpenCV、跨平台等学习记录。【0基础音视频进阶学习路线】
HTML
2,022
star
2

AVSample

0 基础音视频进阶路线 (MediaCodec、FFmpeg、OpenCV、OpenGL、短视频 SDK、音视频播放器、webrtc)
C
426
star
3

AVEditor

这是一款短视频编辑 SDK,仿 DouYin 音视频处理。功能包含有美颜、滤镜、贴纸、特效、录制、分段录制、速率录制、变声、配乐、rtmp 直播推流、图片转视频、剪辑,mp4/flv 格式封装等功能。动态库用的我另一个项目编译好的 https://github.com/yangkun19921001/AVFFmpegLib
C
360
star
4

DexEncryptionDecryption

APK 加固 dex 加密,解密 学习项目
Java
221
star
5

NDK_AV_SAMPLE

Android NDK 音视频 FFmpeg OpenGL OpenCV rtmp 直播 学习记录! 想要更全面的学习音视频可以点击👉(适合零基础入门音视频专栏)
C
151
star
6

KeepAlive

Android <=8.0 进程保活方案
Java
135
star
7

AVRtmpPushSDK

这是一个由 kotlin 、C++ 编写的 RTMP 推流项目
Kotlin
109
star
8

YKCrash

Android 崩溃捕获(Java,native)
C++
47
star
9

YKAVStudyPlatform

ffmpeg、ffplay、ffprobe 调试环境搭建,个人音视频全平台学习记录
C
38
star
10

AudioManager

这是一个 Android 端万能音频播放器,只要给我一个路径我就能进行播放。
C
37
star
11

LIBJPEG_SAMPLE

Android libjpeg 图片压缩,哈夫曼算法图片压缩
C
36
star
12

OpenRTCProject

基于 webrtc 实现的各种项目
JavaScript
36
star
13

long_picture_view

加载 长图控件,仿微博加载方式
Java
28
star
14

CustomViewSample

自定义View 练习 demo
Kotlin
23
star
15

Kotlin_GitHub

基于 Kotlin + MVP + retrofit + Okhttp +RxJava + Glide + anko + sw 限定符做了屏幕适配 等框架编写的 GitHub APP ,仅供学习
Kotlin
23
star
16

YKProBus

轻量级进程间通信框架,基于 Messenger 实现。进程间传递数据不错的选择
Java
23
star
17

MemoryFileWriteBytesYUV

解决执法仪本地录制和第三方软件同时使用摄像头资源不被占用的问题
Java
21
star
18

QTFFPlayer

MAC、Win、Linux、Android、IOS 跨平台播放器开发
C++
16
star
19

ffplay2

基于 ffplay 实现的 PC/Android/IOS 跨平台播放器
C
10
star
20

YKComponent

Android 组件化框架探索
Java
7
star
21

AndroidDpCode

Android 中 设计模式探索
Java
6
star
22

hotfix

基于类加载的热修复
Java
6
star
23

FWX_Component_Project

高仿微信(学习项目)
Java
6
star
24

ChatUI_Component

聊天输入框,列表,录像等框架
Java
6
star
25

YUVPlay

OpenGL, YUV 渲染
Java
6
star
26

T01_AV_SDKDEMO

[凌壹世纪科技有限公司](http://www.t01.com.cn/) VOIP 融合通信 SDK
Java
5
star
27

WebRTCSample

从 WebRTC 中抽代码
Java
5
star
28

WebFFplay

web 端基于 ffmpeg 实现音视频播放器的一个 demo
JavaScript
5
star
29

media_codec_sample

native 层 MediaCodec 硬编码代码提供 mk / cmake 编译 .s /.so
C
4
star
30

native_mediacodec_test

测试 native 调用 MediaCodec 代码
C++
4
star
31

FaceDetectionOpenCV

OpenCV+Dlib 人脸识别项目
C++
3
star
32

YEventBus

一个轻量级 EventBus ,支持根据 TAG 接收事件
Java
3
star
33

YKPluginAPK

Android 中插件化探索,动态加载 APK 文件中(Activity,Servicer,Broadcast)等一些资源。
Java
3
star
34

BaseComponent

基于前辈大神修改为属于自己的组件化框架 https://github.com/JessYanCoding/ArmsComponent/wiki
Java
3
star
35

ndk_sample

Android 调用 C/C++ 最简单的一个实例 零基础易看懂
Java
3
star
36

CustomHandler

实现简易的 Handler 线程间通信架构
Java
3
star
37

AndroidComponentTest

Android中一些常用的 Utils 或者 组件学习代码
Java
2
star
38

NDK_OpenGL_ES3.0

OpenGL ES 3.0 学习记录
C
2
star
39

YKDB

轻量级数据库,不用写 SQL ,仅仅通过注解就能完成对数据库的操作
Java
2
star
40

TTScreenDensity-master

今日头条适配方案
Java
2
star
41

solo-blog

DevYK 的个人博客 - 记录精彩的程序人生
1
star
42

h264-extractor

Wireshark 中获取 H264 视频码流
Lua
1
star
43

KingKongRTC

This is a cross-platform RTC library
C++
1
star
44

battery

电量优化 部分代码
Java
1
star
45

component_project

基于前辈大神修改为属于自己的组件化框架 https://github.com/JessYanCoding/ArmsComponent/wiki
Java
1
star
46

BitmapMemoryManager

Bitmap 三级缓存
Java
1
star