项目中需要上传视频,自然就需要压缩视频了,然后就去百度,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后的样子是:
接下来就开始集成:
第一步:在工程目录下的 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