RecorderManager安卓仿微信自定義音視訊錄製
因為在專案中經常需要使用音視訊錄製,所以寫了一個公共庫RecorderManager,歡迎大家使用。
一.效果展示
仿微信介面視訊錄製

圖片描述

圖片描述
2.音訊錄製介面比較簡單,就不放圖了
二.引用
1.Add it in your root build.gradle at the end of repositories
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
2.Add the dependency
dependencies { implementation 'com.github.MingYueChunQiu:RecorderManager:0.2.3' }
三.使用
1.音訊錄製
採用預設配置錄製
mRecorderManager.recordAudio(mFilePath);
自定義配置引數錄製
mRecorderManager.recordAudio(new RecorderOption.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) .setAudioEncoder(MediaRecorder.AudioEncoder.AAC) .setAudioSamplingRate(44100) .setBitRate(96000) .setFilePath(path) .build();
2.視訊錄製
(1).可以直接使用RecordVideoActivity,實現了仿微信風格的錄製介面
startActivity(new Intent(MainActivity.this, RecordVideoActivity.class));
通過在Intent中傳入下列引數來設定路徑和最長時間
//設定視訊錄製的最長時間 intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 20); //設定視訊錄製的畫質 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
RecordVideoActivity裡已經配置好了預設引數,可以直接使用,然後在onActivityResult裡拿到視訊路徑的返回值
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == 0) { Log.e("onActivityResult", "onActivityResult: " + " " + data.getStringExtra(EXTRA_RECORD_VIDEO_FILE_PATH) + " " + data.getIntExtra(EXTRA_RECORD_VIDEO_DURATION, -1)); } }
(2).如果想要介面一些控制元件的樣式,可以繼承RecordVideoActivity,裡面提供了幾個protected方法,可以拿到介面的一些控制元件
/** * 獲取計時控制元件 * * @return 返回計時AppCompatTextView */ protected AppCompatTextView getTimingView() { return mRecordVideoFg == null ? null : mRecordVideoFg.getTimingView(); } /** * 獲取圓形進度按鈕 * * @return 返回進度CircleProgressButton */ protected CircleProgressButton getCircleProgressButton() { return mRecordVideoFg == null ? null : mRecordVideoFg.getCircleProgressButton(); } /** * 獲取播放控制元件 * * @return 返回播放AppCompatImageView */ protected AppCompatImageView getPlayView() { return mRecordVideoFg == null ? null : mRecordVideoFg.getPlayView(); } /** * 獲取取消控制元件 * * @return 返回取消AppCompatImageView */ protected AppCompatImageView getCancelView() { return mRecordVideoFg == null ? null : mRecordVideoFg.getCancelView(); } /** * 獲取確認控制元件 * * @return 返回確認AppCompatImageView */ protected AppCompatImageView getConfirmView() { return mRecordVideoFg == null ? null : mRecordVideoFg.getConfirmView(); } /** * 獲取返回控制元件 * * @return 返回返回AppCompatImageView */ protected AppCompatImageView getBackView() { return mRecordVideoFg == null ? null : mRecordVideoFg.getBackView(); }
想要替換圖示資源的話,提供下列名稱圖片
record_video_cancel.png record_video_confirm.png record_video_play.png record_video_pull_down.png
(3).同時提供了對應的RecordVideoFragment,實現與RecordVideoActivity同樣的功能,實際RecordVideoActivity就是包裹了一個RecordVideoFragment
1.建立RecordVideoFragment
/** * 獲取錄製視訊Fragment例項(使用預設配置項) * * @param filePath 儲存檔案路徑 * @return 返回RecordVideoFragment */ public static RecordVideoFragment newInstance(String filePath) { return newInstance(filePath, 30); } /** * 獲取錄製視訊Fragment例項(使用預設配置項) * * @param filePath儲存檔案路徑 * @param maxDuration 最大時長(秒數) * @return 返回RecordVideoFragment */ public static RecordVideoFragment newInstance(String filePath, int maxDuration) { return newInstance(new RecordVideoOption.Builder() .setRecorderOption(new RecorderOption.Builder().buildDefaultVideoBean(filePath)) .setMaxDuration(maxDuration) .build()); } /** * 獲取錄製視訊Fragment例項 * * @param option 錄製配置資訊物件 * @return 返回RecordVideoFragment */ public static RecordVideoFragment newInstance(RecordVideoOption option) { RecordVideoFragment fragment = new RecordVideoFragment(); fragment.mOption = option; if (fragment.mOption == null) { fragment.mOption = new RecordVideoOption(); } if (fragment.mOption.getRecorderOption() == null && fragment.getContext() != null) { File file = fragment.getContext().getExternalFilesDir(Environment.DIRECTORY_MOVIES); if (file != null) { fragment.mOption.setRecorderOption(new RecorderOption.Builder().buildDefaultVideoBean( file.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".mp4")); } } return fragment; }
2.然後新增RecordVideoFragment到自己想要的地方就可以了
3.可以設定OnRecordVideoListener,拿到各個事件的回撥
public class RecordVideoOption: private RecorderOption option;//錄製配置資訊 private int maxDuration;//最大錄製時間 private OnRecordVideoListener listener;//錄製視訊監聽器 /** * 錄製視訊監聽器 */ public interface OnRecordVideoListener { /** * 當完成視訊錄製時回撥 * * @param filePath視訊檔案路徑 * @param videoDuration 視訊時長(毫秒) */ void onCompleteRecordVideo(String filePath, int videoDuration); /** * 當點選返回按鈕時回撥 */ void onClickBack(); }
(4).如果想自定義自己的介面,可以直接使用RecorderManager類
1.建立RecorderManager例項
public class RecorderManager implements RecorderManagerable /** * 建立錄製管理類例項(使用預設錄製類) * * @return 返回錄製管理類例項 */ public static RecorderManagerable newInstance() { return new RecorderManager(new RecorderHelper()); } /** * 建立錄製管理類例項 * * @param recorderable 實際錄製類 * @return 返回錄製管理類例項 */ public static RecorderManagerable newInstance(Recorderable recorderable) { return new RecorderManager(recorderable); }
它們返回的都是RecorderManagerable 介面型別,RecorderManager 是預設的實現類,RecorderManager 內持有一個真正進行操作的Recorderable。
Recorderable是一個介面型別,由實現Recorderable的子類來進行錄製操作,預設提供的是RecorderHelper,RecorderHelper實現了Recorderable。
public interface Recorderable { boolean recordAudio(String path); boolean recordAudio(RecorderOption bean); boolean recordVideo(Camera camera, Surface surface, String path); boolean recordVideo(Camera camera, Surface surface, RecorderOption bean); void release(); MediaRecorder getMediaRecorder(); }
2.拿到後建立相機物件
if (mCamera == null) { mCamera = mManager.initCamera(); } try { mCamera.setPreviewDisplay(svVideoRef.get().getHolder()); mCamera.startPreview(); mCamera.unlock(); } catch (IOException e) { e.printStackTrace(); }
3.錄製
isRecording = mManager.recordVideo(mCamera, svVideoRef.get().getHolder().getSurface(), mOption.getRecorderOption());
4.釋放
mManager.release(); mManager.releaseCamera(mCamera); mCamera = null;
四.總結
目前來說,大體流程就是這樣,更詳細的資訊請到Github上檢視, 後期將新增攝像頭切換、閃光燈等更多功能,敬請關注,github地址為 https://github.com/MingYueChunQiu/RecorderManager ,碼雲地址為 https://gitee.com/MingYueChunQiu/RecorderManager ,如果它能對你有所幫助,請幫忙點個star,有什麼建議或意見歡迎反饋。

大綱與資料.png

高清視訊資料.jpg