今天研究了一下视频上传的处理,还包括研究可以视频压缩,本地视频、录制视频上传。本地视频获取需要适配手机,这个建议自己获取本地视频列表自己实现。不然就会出现路径找不到返回 null
好东西都是要分享给大家的 有问题请留言评论。。。
视频压缩我用的是七牛的 ,我们图片上传的就是七牛,七牛的视频压缩还是很快的
感兴趣可以看看官网文档 看不懂就看下面加红的那个链接
https://developer.qiniu.com/pili/sdk/3734/android-short-video-sdk
视频压缩可以看这个博客的介绍 ,他写的挺详细 我就不写了
一、权限设置
<!-- 读取内部存储数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写入内部存储数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
二、本地视频跳转
//选择视频
private void selectVideo() {
if (android.os.Build.BRAND.equals("Huawei")) {
Intent intentPic = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intentPic, 2);
}
if (android.os.Build.BRAND.equals("Xiaomi")) {//是否是小米设备,是的话用到弹窗选取入口的方法去选取视频
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "video/*");
startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);
} else {//直接跳到系统相册去选取视频
Intent intent = new Intent();
if (Build.VERSION.SDK_INT < 19) {
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("video/*");
} else {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("video/*");
}
startActivityForResult(Intent.createChooser(intent, "选择要导入的视频"), 2);
}
}
三、视频录制跳转
//拍摄视频
private void video() {
push_mp3 = true;
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
startActivityForResult(intent, 3);
}
四、视频录制和本地视频获取
requestCode=3是视频录制获取
requestCode=2是本地视频获取
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && null != data && requestCode == 3) {
Uri uri = data.getData();
ContentResolver cr = this.getContentResolver();
/** 数据库查询操作。
* 第一个参数 uri:为要查询的数据库+表的名称。
* 第二个参数 projection : 要查询的列。
* 第三个参数 selection : 查询的条件,相当于SQL where。
* 第三个参数 selectionArgs : 查询条件的参数,相当于 ?。
* 第四个参数 sortOrder : 结果排序。
*/
assert uri != null;
Cursor cursor = cr.query(uri, null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
// 视频ID:MediaStore.Audio.Media._ID
int videoId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
// 视频名称:MediaStore.Audio.Media.TITLE
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
// 视频路径:MediaStore.Audio.Media.DATA
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
// 视频时长:MediaStore.Audio.Media.DURATION
int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
// 视频大小:MediaStore.Audio.Media.SIZE
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
Log.e("size ", size + "");
// 视频缩略图路径:MediaStore.Images.Media.DATA
String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
// 缩略图ID:MediaStore.Audio.Media._ID
int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
// 方法一 Thumbnails 利用createVideoThumbnail 通过路径得到缩略图,保持为视频的默认比例
// 第一个参数为 ContentResolver,第二个参数为视频缩略图ID, 第三个参数kind有两种为:MICRO_KIND和MINI_KIND 字面意思理解为微型和迷你两种缩略模式,前者分辨率更低一些。
Bitmap bitmap1 = MediaStore.Video.Thumbnails.getThumbnail(cr, imageId, MediaStore.Video.Thumbnails.MICRO_KIND, null);
// 方法二 ThumbnailUtils 利用createVideoThumbnail 通过路径得到缩略图,保持为视频的默认比例
// 第一个参数为 视频/缩略图的位置,第二个依旧是分辨率相关的kind
Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MICRO_KIND);
// 如果追求更好的话可以利用 ThumbnailUtils.extractThumbnail 把缩略图转化为的制定大小
if (duration > 11000) {
Toast.makeText(getApplicationContext(), "视频时长已超过10秒,请重新选择", Toast.LENGTH_SHORT).show();
return;
}
}
cursor.close();
}
} else if (resultCode == RESULT_OK && null != data && requestCode == 2) { {
Uri uri = data.getData();
String path = getRealPathFromURI(uri);
Log.d("path", "path==" + path);
File file = new File(path);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();//实例化MediaMetadataRetriever对象
mmr.setDataSource(file.getAbsolutePath());
Bitmap bitmap = mmr.getFrameAtTime();//获得视频第一帧的Bitmap对象
String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)
Log.d("ddd", "duration==" + duration);
int int_duration = Integer.parseInt(duration);
if (int_duration > 11000) {
Toast.makeText(getApplicationContext(), "视频时长已超过10秒,请重新选择", Toast.LENGTH_SHORT).show();
return;
}
}
}
}
uri转path的方法
public String getRealPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}
自己写的东西肯定要适配很多东西和大量测试,建议还是使用比较出色一点的开源库
https://github.com/LuckSiege/PictureSelector
欢迎加入技术分享学习公众号【码兄】