Android 平台上拍照/录像,图片/视频选择,编辑和压缩的一站式解决方案。
16lz
2021-01-23
phoenix
项目地址:guoxiaoxing/phoenix
简介:The one-stop solution for image/video selection, editing and compression on the Android platform.
更多:作者 提 Bug
标签:
功能介绍
Android 平台上拍照/录像,图片/视频选择,编辑和压缩的一站式解决方案。
图片/视频的选择,编辑和压缩是日常开发中的常见需求,Phoenix 完整的实现了这些功能,并提供了优雅的调用方式。Phoenix 的核心功能基于 Kotlin 实现,外层接口基于 Java 实现,方便 Kotlin 与 Java 双方的调用。
更多关于图像/视频编解码的文章
- Android 平台图像压缩方案
- Android 平台 Camera 开发实践指南
特点
- 功能相互独立,各个功能的实现依赖于约定的接口,彼此互不依赖,开发者不必为了引入某一个功能而带入一堆依赖。
- 高度的 UI 定制性,内置四种配色方案,开发者也可以通过简单的 style 文件的简单配置来定制自己的 UI。
- 调用的便利性,开启某个功能只需要调用 enableXXX(true)方法,结果统一在 MediaEntity 里获取。
- 库体积轻便小巧,视频压缩基于系统的 MediaCodec 实现,压缩速度快,无额外的依赖。
- RxJava 良好的支持性,每个功能都提供了同步与异步两种实现,便于开发者利用 RxJava 进行功能的组合与嵌套。
- ImageLoader 可配置,定制项目需要的图片加载方案。
- 良好的版本兼容性,运行时权限等内容都做了兼容性处理。
功能
- 拍照
- 录制视频
- 图片选择
- 图片预览
- 图片压缩
- 图片标记、贴图、涂抹与裁剪
- 视频选择
- 视频预览
- 视频压缩
主题
- 默认主题
- 橙色主图
- 红色主题
- 蓝色主题
快递开始
添加依赖
//图片/视频选择、预览、编辑与拍照implementation 'com.github.guoxiaoxing:phoenix:1.0.15'//选填 - 图片压缩,开启功能:Phoenix.with().enableCompress(true),获取结果:MediaEntity.getCompressPath()implementation 'com.github.guoxiaoxing:phoenix-compress-picture:1.0.15'//选填 - 视频压缩,开启功能:Phoenix.with().enableCompress(true),获取结果:MediaEntity.getCompressPath()implementation 'com.github.guoxiaoxing:phoenix-compress-video:1.0.15'
调用功能
初始化
public class App extends Application { @Override public void onCreate() { super.onCreate(); Phoenix.config() .imageLoader(new ImageLoader() { @Override public void loadImage(Context mContext, ImageView imageView , String imagePath, int type) { Glide.with(mContext) .load(imagePath) .into(imageView); } }); }}
开启功能
Phoenix.with() .theme(PhoenixOption.THEME_DEFAULT)// 主题 .fileType(MimeType.ofAll())//显示的文件类型图片、视频、图片和视频 .maxPickNumber(10)// 最大选择数量 .minPickNumber(0)// 最小选择数量 .spanCount(4)// 每行显示个数 .enablePreview(true)// 是否开启预览 .enableCamera(true)// 是否开启拍照 .enableAnimation(true)// 选择界面图片点击效果 .enableCompress(true)// 是否开启压缩 .compressPictureFilterSize(1024)//多少 kb 以下的图片不压缩 .compressVideoFilterSize(2018)//多少 kb 以下的视频不压缩 .thumbnailHeight(160)// 选择界面图片高度 .thumbnailWidth(160)// 选择界面图片宽度 .enableClickSound(false)// 是否开启点击声音 .pickedMediaList(mMediaAdapter.getData())// 已选图片数据 .videoFilterTime(0)//显示多少秒以内的视频 .mediaFilterSize(10000)//显示多少 kb 以下的图片/视频,默认为 0,表示不限制 //如果是在 Activity 里使用就传 Activity,如果是在 Fragment 里使用就传 Fragment .start(MainActivity.this, PhoenixOption.TYPE_PICK_MEDIA, REQUEST_CODE);
获取结果
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { //返回的数据 List result = Phoenix.result(data); mMediaAdapter.setData(result); }}
另外,Phoenix 内置了图片压缩库与视频压缩库,这两个功能都可以单独调用。
图片压缩
同步方法
File file = new File(localPath);try { File compressFIle = PictureCompressor.with(mContext) .savePath(mContext.getCacheDir().getAbsolutePath()) .load(file) .get(); if (compressFIle != null) { String compressPath = compressFIle.getAbsolutePath(); }} catch (IOException e) { e.printStackTrace();}
异步方法
File file = new File(localPath);PictureCompressor.with(mContext) .load(file) .setCompressListener(new OnCompressListener() { @Override public void onStart() { } @Override public void onSuccess(File file) { String compressPath = file.getAbsolutePath(); } @Override public void onError(Throwable e) { } }).launch();
视频压缩
同步方法
final File compressFile;try { File compressCachePath = new File(mContext.getCacheDir(), "outputs"); compressCachePath.mkdir(); compressFile = File.createTempFile("compress", ".mp4", compressCachePath);} catch (IOException e) { Toast.makeText(mContext, "Failed to create temporary file.", Toast.LENGTH_LONG).show(); return null;}try { String compressPath = VideoCompressor.with().syncTranscodeVideo(mediaEntity.getLocalPath(), compressFile.getAbsolutePath(), MediaFormatStrategyPresets.createAndroid480pFormatStrategy());} catch (IOException e) { e.printStackTrace();}
异步方法
final File compressFile;try { File compressCachePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "phoenix"); compressCachePath.mkdir(); compressFile = File.createTempFile("compress", ".mp4", compressCachePath);} catch (IOException e) { Toast.makeText(mContext, "Failed to create temporary file.", Toast.LENGTH_LONG).show(); return;}VideoCompressor.Listener listener = new VideoCompressor.Listener() { @Override public void onTranscodeProgress(double progress) { } @Override public void onTranscodeCompleted() { String compressPath = compressFile.getAbsolutePath(); } @Override public void onTranscodeCanceled() { } @Override public void onTranscodeFailed(Exception exception) { }};try { VideoCompressor.with().asyncTranscodeVideo(mediaEntity.getLocalPath(), compressFile.getAbsolutePath(), MediaFormatStrategyPresets.createAndroid480pFormatStrategy(), listener);} catch (IOException e) { e.printStackTrace();}
视频压缩的测试数据
手机型号 | 源视频时长 | 源视频大小 | 压缩视频大小 | 压缩耗时 |
---|---|---|---|---|
小米 4 | 60s | 55.67MB | 5.56MB | 20.17s |
荣耀 7 | 60s | 68.37MB | 6.22MB | 18.83s |
oppo r9 | 60s | 55.57MB | 5.35MB | 38.27s |
可以看到对于 60s 的视频,压缩时间控制在了 18s~22s 之间,性能好的手机用时短一些,另外,压缩提供了 480p、720p 等多种规格的压缩参数。
更多相关文章
- Android Webview upload 图片上传
- Android视频编码器
- Android图片圆角转换 RoundedImageView开源项目 小记
- Android实现动态自动匹配输入内容功能
- Android 接入Facebook分享功能
- Android UI开发第二十二篇――android 瀑布流图片实现
- Android模拟器常用使用,和基本功能使用
- Android 绘制一个Loading动画__向图片中缓慢填充颜色,从而形成动
- 如何在Android当中显示网络图片