1. 程式人生 > >Android實現本地視訊+錄製視訊+視訊壓縮上傳

Android實現本地視訊+錄製視訊+視訊壓縮上傳

今天研究了一下視訊上傳的處理,還包括研究可以視訊壓縮,本地視訊、錄製視訊上傳。本地視訊獲取需要適配手機,這個建議自己獲取本地視訊列表自己實現。不然就會出現路徑找不到返回 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;
    }

 

自己寫的東西肯定要適配很多東西和大量測試,建議還是使用比較出色一點的開源庫

https://github.com/LuckSiege/PictureSelector