Android-推荐一个视频压缩库RxFFmpeg

图片来源于网络

最近项目当中有遇到上传视频的时候,需要做合理压缩的需求。分享一下我使用的视频压缩库,希望能帮助遇到同样有视频处理的需求的小伙伴。

RxFFmpeg依赖

这个开源库一共有三个版本,这里贴两个版本的依赖:

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

迷你版需要找开源库的大佬付费定制版本,如果真的有特别需求的小伙伴可以去GitHub的RxFFmpeg主页了解一下。

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

这里NDK支持按照自己的需求开放,全部支持会增加一定的apk大小。下面来说说相关的库的使用。

debug模式设置
RxFFmpegInvoke.getInstance().setDebug(true);

开始或者关闭debug模式,建议是在Application当中调用。

FFmpeg使用举例

由于我个人使用是在项目当中的,这里贴一下开源库的代码:


    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();

这个方法建议在onDestory()的时候调用,防止内存泄漏。

构建FFmpeg命令

    public static String[] getBoxblur() {
        RxFFmpegCommandList cmdlist = new RxFFmpegCommandList();
        cmdlist.append("-i");
        cmdlist.append("需要压缩的视频路径");
        cmdlist.append("-vf");
        cmdlist.append("boxblur=5:1");
        cmdlist.append("-preset");
        cmdlist.append("superfast");
        cmdlist.append("压缩后输出文件的路径");
        return cmdlist.build();
    }

获取媒体文件的信息

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

代码混淆

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

按照博客的步骤来,一步步就可以简单实现视频压缩的功能了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的 Android 视频压缩示例,仅供参考: 1. 添加相关依赖 在 app/build.gradle 文件中添加以下依赖: ``` implementation 'com.googlecode.mp4parser:isoparser:1.1.22' implementation 'com.googlecode.mp4parser:isoparser:1.1.22' implementation 'com.googlecode.mp4parser:isoparser:1.1.22' ``` 2. 获取原始视频文件路径 在压缩视频之前,需要先获取原始视频文件的路径。以下是一个简单的方法,可以在 Activity 中获取用户选择的视频文件路径: ``` private String getVideoPathFromIntent(Intent intent) { Uri uri = intent.getData(); String[] projection = {MediaStore.Video.Media.DATA}; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(column_index); cursor.close(); return path; } return null; } ``` 3. 实现视频压缩 以下是一个简单的视频压缩方法,可以将原始视频文件压缩为指定比特率的视频: ``` private void compressVideo(String inputPath, String outputPath, int bitrate) throws IOException { // 创建文件输入流 FileInputStream inputStream = new FileInputStream(inputPath); // 创建视频轨道提取器 Movie movie = MovieCreator.build(inputStream.getChannel()); // 获取视频轨道 Track videoTrack = movie.getTracks().get(0); // 创建视频编码器 MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder(videoTrack, bitrate); // 创建视频输出流 FileOutputStream outputStream = new FileOutputStream(outputPath); // 将压缩后的视频写入输出流 encoder.encodeVideo(outputStream.getChannel()); // 关闭输入输出流 inputStream.close(); outputStream.close(); } ``` 其中,MediaCodecVideoEncoder 是一个自定义的视频编码器类,可以根据自己的需求实现。在上述示例中,我们使用了 MP4Parser 来读取和写入 MP4 格式的视频文件。 以上是一个简单的 Android 视频压缩示例,可以根据自己的需求和技术水平进行修改和扩展。需要注意的是,视频压缩一个复杂的过程,需要考虑到多种因素,如视频质量、压缩比、设备兼容性等,建议在实际项目中进行充分测试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值