SkillAgentSearch skills...

RxFFmpeg

🔥💥RxFFmpeg 是基于 ( FFmpeg 4.0 + X264 + mp3lame + fdk-aac + opencore-amr + openssl ) 编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架,包含以下功能:视频拼接,转码,压缩,裁剪,片头片尾,分离音视频,变速,添加静态贴纸和gif动态贴纸,添加字幕,添加滤镜,添加背景音乐,加速减速视频,倒放音视频,音频裁剪,变声,混音,图片合成视频,视频解码图片,抖音首页,视频播放器及支持 OpenSSL https 等主流特色功能

Install / Use

/learn @microshow/RxFFmpeg

README

Language: English

RxFFmpeg

<img src="/preview/icon/logo-v1.gif" alt="图-1:logo" width="460px"></img>

RxFFmpeg 是基于 ( FFmpeg 4.0 + X264 + mp3lame + fdk-aac + opencore-amr + openssl) 编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架,包含以下功能:视频拼接,转码,压缩,裁剪,片头片尾,分离音视频,变速,添加静态贴纸和gif动态贴纸,添加字幕,添加滤镜,添加背景音乐,加速减速视频,倒放音视频,#百变魔音#,音频裁剪,混音,图片合成视频,视频解码图片,抖音首页,#视频播放器#,及支持 OpenSSL https 等主流特色功能

『DEMO APP』

| 扫码 or 点击下载 | | :--------: | | <img src="/preview/icon/apk_qr.png" alt="图-1:扫码下载体验" width="260px" /> |

编译环节

编译环境

  • win10 + ubuntu 16.04 + gcc + make

主要依赖以下库进行编译

| 库名 | 版本 | 下载地址 | | :-------- | :----- | :---- | | FFmpeg | 4.0 | http://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2 | | X264 | x264-snapshot-20180212-2245-stable | http://download.videolan.org/x264/snapshots/x264-snapshot-20180212-2245-stable.tar.bz2 | | mp3lame | 3.100 | https://jaist.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz | | fdk-aac | 0.1.6 | https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.6.tar.gz | | opencore-amr | 0.1.5 | https://jaist.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.5.tar.gz | | ndk | android-ndk-r10e-linux-x86_64 | https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip |

编译教程&核心源码&各种采坑历程

特色功能

| 功能 | 是否支持 | 简述 | | :-------- | :-----: | :---- | | FFmpeg命令 | √ | 支持任何FFmpeg命令执行 | | FFmpeg进度回调 | √ | 支持FFmpeg命令执行进度回调 | | FFmpeg中断 | √ | 支持中断进行中的FFmpeg命令 | | 同步执行 | √ | 适用于多条命令分步执行 | | 异步执行 | √ | 适用于单条命令执行 | | Debug模式 | √ | 支持开启/关闭 Debug 模式 | | getMediaInfo() | √ | 获取媒体文件详细属性信息 | | 平台架构 | √ | 支持 armeabi-v7a, arm64-v8a, x86, x86_64 | | 硬件加速 | √ | 支持硬件加速,使编解码处理更快(已开启MediaCodec) | | 单个so打包 | √ | 支持把FFmpeg的各子模块打包成一个librxffmpeg-core.so核心库,无需导入七八个so库 | | X264 | √ | 支持libx264编码库,可以使压缩后的视频体积变的极小,清晰度还保持着很高清 | | mp3lame | √ | 支持MP3音频编解码 | | fdk-aac | √ | 支持AAC音频编解码 | | opencore-amr | √ | version >= 4.7.0 支持amr音频编解码(转码时需指定:-ar 8000 -ac 1) | | https | √ | version >= 3.1.0 支持 https | | 格式转换 | √ | 如: avi > mp4 > avi; mp3 > aac > mp3 等 | | 自研播放器 | √ | RxFFmpegPlayer播放器主打轻量、高效、低功耗、视频秒开等特色 | | 常用命令 | √ | 持续更新 点击查看 |

使用方式

Gradle

在根目录下的build.gradle里添加maven仓库


allprojects {
		repositories {
			...
			maven { url 'https://www.jitpack.io' }
		}
	}

添加依赖,最新版本版本更新记录


dependencies {
    //以下选一个即可
    
    //完整版
    implementation 'com.github.microshow:RxFFmpeg:4.9.0'
    
    //极速版 (预计占用 4M 左右空间),主要移除了一些不常用的编解码器
    implementation 'com.github.microshow:RxFFmpeg:4.9.0-lite'
    
}

如果你的App只要v7a平台,可以只保留armeabi-v7a,不过推荐加上arm64-v8a架构,这样性能会大大提升


defaultConfig {
    .
    .
    .
    ndk {
        //目前已支持 "armeabi-v7a","arm64-v8a","x86","x86_64" 平台架构
        abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"
    }
}

开始

  • 开启/关闭 debug 模式,建议在 Application 初始化调用

    RxFFmpegInvoke.getInstance().setDebug(true);

  • FFmpeg 命令执行 (RxJava2优雅的调用)

    private void runFFmpegRxJava() {

        String text = "ffmpeg -y -i /storage/emulated/0/1/input.mp4 -vf boxblur=25:5 -preset superfast /storage/emulated/0/1/result.mp4";

        String[] commands = text.split(" ");

        myRxFFmpegSubscriber = new MyRxFFmpegSubscriber(this);

        //开始执行FFmpeg命令
        RxFFmpegInvoke.getInstance()
                .runCommandRxJava(commands)
                .subscribe(myRxFFmpegSubscriber);

    }

    public static class MyRxFFmpegSubscriber extends RxFFmpegSubscriber {

        private WeakReference<HomeFragment> mWeakReference;

        public MyRxFFmpegSubscriber(HomeFragment homeFragment) {
            mWeakReference = new WeakReference<>(homeFragment);
        }

        @Override
        public void onFinish() {
            final HomeFragment mHomeFragment = mWeakReference.get();
            if (mHomeFragment != null) {
                mHomeFragment.cancelProgressDialog("处理成功");
            }
        }

        @Override
        public void onProgress(int progress, long progressTime) {
            final HomeFragment mHomeFragment = mWeakReference.get();
            if (mHomeFragment != null) {
                //progressTime 可以在结合视频总时长去计算合适的进度值
                mHomeFragment.setProgressDialog(progress, progressTime);
            }
        }

        @Override
        public void onCancel() {
            final HomeFragment mHomeFragment = mWeakReference.get();
            if (mHomeFragment != null) {
                mHomeFragment.cancelProgressDialog("已取消");
            }
        }

        @Override
        public void onError(String message) {
            final HomeFragment mHomeFragment = mWeakReference.get();
            if (mHomeFragment != null) {
                mHomeFragment.cancelProgressDialog("出错了 onError:" + message);
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (myRxFFmpegSubscriber != null) {
            myRxFFmpegSubscriber.dispose();
        }
    }

  • FFmpeg 命令执行 (同步方式)

    RxFFmpegInvoke.getInstance().runCommand(command, null);

  • 中断 FFmpeg 命令

    RxFFmpegInvoke.getInstance().exit();

  • 构建命令,使用RxFFmpegCommandList构建,可以有效避免路径带有空格等问题

    public static String[] getBoxblur() {
        RxFFmpegCommandList cmdlist = new RxFFmpegCommandList();
        cmdlist.append("-i");
        cmdlist.append("/storage/emulated/0/1/input.mp4");
        cmdlist.append("-vf");
        cmdlist.append("boxblur=5:1");
        cmdlist.append("-preset");
        cmdlist.append("superfast");
        cmdlist.append("/storage/emulated/0/1/result.mp4");
        return cmdlist.build();
    }

  • 获取媒体文件信息

    RxFFmpegInvoke.getInstance().getMediaInfo(String filePath);

代码混淆


    -dontwarn io.microshow.rxffmpeg.**
    -keep class io.microshow.rxffmpeg.**{*;}

优质项目

* GSYVideoPlayer (Android端的视频播放器神器)

* AiSound百变魔音 (一个神奇的魔法声音)

* RetrofitGO (轻量级的网络请求库-支持缓存配置)

常用命令

* 常用命令汇总

* FFmpeg文档汇总

* FFmpeg Filters文档

ScreenShot

<img src="/preview/icon/screen-shot.gif" alt="图-1:screenShot.gif" width="240px"></img>

性能比对:arm64-v8a VS armeabi-v7a

<img src="/preview/icon/run_time_arm64-v8a.jpg" alt="图-2:arm64-v8a" width="240px"></img> <img src="/preview/icon/run_time_armeabi-v7a.jpg" alt="图-1:armeabi-v7a" width="240px"></img>

总结:可以看出arm64-v8a架构的运行效率远大于armeabi-v7a,强烈建议在你的App添加arm64-v8a架构的so,同时也是响应Google的号召。

实验室

自研视频播放器RxFFmpegPlayer

  • 自研RxFFmpegPlayer播放器内核基于(FFmpeg OpenGL OpenSL)

  • 主打轻量级、高效、低功耗,播放本地视频秒开等特色

  • 涵盖播放器基本的 播放、暂停、快进、快退、音量控制、声道控制、循环播放、播放进度、加载状态等功能

  • 支持播放本地视频文件、在线视频、直播流(hls、rtmp、m3u8…)等

  • 项目里已集成OpenSSL所以也支持Https访问

  • 视频画面支持双指缩放、旋转、移动等手势操作

  • 支持切换系统MediaPlayer内核

<img src="/preview/icon/screen_player.gif" alt="图-1:screen_player.gif" width="240px"></img>

谁在用?

按登记顺序排序,更多接入APP,欢迎去这里登记(供开源用户参考),据不完整数据统计,目前已有上千款App已接入RxFFmpeg,为音视频项目赋能!

[![](https://pp.my

View on GitHub
GitHub Stars4.7k
CategoryContent
Updated1d ago
Forks778

Languages

C

Security Score

85/100

Audited on Mar 27, 2026

No findings