Android實現本地視訊+錄製視訊+視訊壓縮上傳
阿新 • • 發佈:2018-12-06
今天研究了一下視訊上傳的處理,還包括研究可以視訊壓縮,本地視訊、錄製視訊上傳。本地視訊獲取需要適配手機,這個建議自己獲取本地視訊列表自己實現。不然就會出現路徑找不到返回 null
好東西都是要分享給大家的 有問題請留言評論。。。
視訊壓縮我用的是七牛的 ,我們圖片上傳的就是七牛,七牛的視訊壓縮還是很快的
感興趣可以看看官網文件 看不懂就看下面加紅的那個連結
https://developer.qiniu.com/pili/sdk/3734/android-short-video-sdk
視訊壓縮可以看這個部落格的介紹 ,他寫的挺詳細 我就不寫了
https://blog.csdn.net/qq_31796651/article/details/79154072
一、許可權設定
<!-- 讀取內部儲存資料許可權 -->
<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;
}
自己寫的東西肯定要適配很多東西和大量測試,建議還是使用比較出色一點的開源庫