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

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

接下来就开始集成:
第一步:在工程目录下的 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以上权限问题自己处理)
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.RECORD_AUDIO" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.FLASHLIGHT" />
 第三步:重点来了转码(压缩视频)的代码/**
      * 压缩视频
      *
      * @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,
     };


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