android视频压缩

项目中需要上传视频,自然就需要压缩视频了,然后就去百度,google,结果都是基于 FFmpeg,自己也集成了 FFmpeg看看效果,结果大失所望,应用多了二十兆,压缩一个10秒50多兆的视频用了将近1分钟,以为自己集成有问题,然后又是百度和问一些大牛,都说确实存在这样的问题,压缩效率很低。然后就放弃了 FFmpeg。最后试过阿里的,没找到压缩放弃了,又有人说七牛短视频,下载了demo试了下感觉不错,看到它有一个转码功能实现了压缩,集成测试了下确实很不错,这里写出来让需要的同学少走点弯路。(我弄了一周多,一边开发别的功能,一边寻找压缩视频的方法)

 

不想看下面过程的直接移步github,demo使用最新的2.0sdk也可以压缩:压缩demo   

使用七牛短视频里面的转码功能,先去下载sdk;

demoApk下载(自己将官方demo打了一个包):链接:点击打开链接 密码: rxkx

官网链接:https://developer.qiniu.com/pili/sdk/3734/short-video-android-sdk#6

sdk下载地址:https://developer.qiniu.com/sdk#official-sdk(进入往下翻找到短视频,下载对应的sdk,还有文档可以查看)

下载sdk后的样子是:

android视频压缩_第1张图片

接下来就开始集成:

第一步:在工程目录下的 build.gradle中添加

compile files('libs/pldroid-shortvideo-x.y.z.jar')//x.y.z就是你的jar文件版本我的是1.7.0

注意:这里提下可能遇到的引入jar文件、so文件、arr文件问题解决方法:

第一种:在main下面新建jniLibs并把.so文件复制到该目录下,并把jar放在lib目录下并添加到项目中。

第二种方法:jar包和so文件都放在libs目录下。

//libs中的jar文件或者so文件

在android中添加:

android{ 
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir "libs"
    }
}
在dependencies 中添加:
dependencies {
 compile(name: 'XXXX', ext: 'aar')//XXXX就是你的arr文件的名字
}

第二步:添加相关权限(关于android6.0以上权限问题自己处理)






第三步:重点来了转码(压缩视频)的代码

 

/**
     * 压缩视频
     *
     * @param mContext
     * @param filepath
     */
    public void compressVideoResouce(Context mContext, String filepath) {
        if (TextUtils.isEmpty(filepath)) {
            ToastUtils.getInstance().showToast("请先选择转码文件!");
            return;
        }
        //PLShortVideoTranscoder初始化,三个参数,第一个context,第二个要压缩文件的路径,第三个视频压缩后输出的路径
        PLShortVideoTranscoder mShortVideoTranscoder = new PLShortVideoTranscoder(mContext, filepath, APPConstant.LOCAL_PATH + "compress/transcoded.mp4");
        MediaMetadataRetriever retr = new MediaMetadataRetriever();
        retr.setDataSource(filepath);
        String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
        String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
        String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
        int transcodingBitrateLevel = 6;//我这里选择的2500*1000压缩,这里可以自己选择合适的压缩比例
        mShortVideoTranscoder.transcode(Integer.parseInt(width), Integer.parseInt(height), getEncodingBitrateLevel(transcodingBitrateLevel), false, new PLVideoSaveListener() {
            @Override
            public void onSaveVideoSuccess(String s) {
               
            }

            @Override
            public void onSaveVideoFailed(final int errorCode) {
               
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        switch (errorCode) {
                            case ERROR_NO_VIDEO_TRACK:
                                ToastUtils.getInstance().showToast("该文件没有视频信息!");
                                break;
                            case ERROR_SRC_DST_SAME_FILE_PATH:
                                ToastUtils.getInstance().showToast("源文件路径和目标路径不能相同!");
                                break;
                            case ERROR_LOW_MEMORY:
                                ToastUtils.getInstance().showToast("手机内存不足,无法对该视频进行时光倒流!");
                                break;
                            default:
                                ToastUtils.getInstance().showToast("transcode failed: " + errorCode);
                        }
                    }
                });
            }

            @Override
            public void onSaveVideoCanceled() {
//                LogUtil.e("onSaveVideoCanceled");
            }

            @Override
            public void onProgressUpdate(float percentage) {
//                LogUtil.e("onProgressUpdate==========" + percentage);
            }
        });
    }

    /**
     * 设置压缩质量
     *
     * @param position
     * @return
     */
    private int getEncodingBitrateLevel(int position) {
        return ENCODING_BITRATE_LEVEL_ARRAY[position];
    }

    /**
     * 选的越高文件质量越大,质量越好
     */
    public static final int[] ENCODING_BITRATE_LEVEL_ARRAY = {
            500 * 1000,
            800 * 1000,
            1000 * 1000,
            1200 * 1000,
            1600 * 1000,
            2000 * 1000,
            2500 * 1000,
            4000 * 1000,
            8000 * 1000,
    };

这里压缩视频就可以了,在使用中发现哪里有错,欢迎留言告知!

留言区有一位哥们分享了一个还不错的视频压缩,有些伙伴可能不看留言的,特意写在这里,github地址:https://github.com/fishwjy/VideoCompressor
自己去试了下,60兆压缩用时17秒压缩后6.29兆,252兆压缩用时72秒压缩后34.86,感觉还可以,视频不是很大压缩还是挺快的

有问题也可以加群,我们一起讨论:qq群:964138991

 

你可能感兴趣的:(android视频压缩)