RecorderManager安卓仿微信自定义音视频录制第三方库
因為在項目中經常需要使用音視頻錄制,所以寫了一個公共庫RecorderManager,歡迎大家使用。
最新0.4.0-beta.5版本:
1.升級依賴
2.移除EasyPermissions和廢棄方法,使用新API registerForActivityResult,請采用Java1.8以上版本
3.重構框架,優化代碼
4.庫調用做部分調整,詳見下方文檔說明
5.歡迎大家測試反饋完善功能
0.3.2版本:1.移除strings.xml中app_name
2.升級kotlin
0.3.1版本更新:詳情見文檔
1.新增最小錄制時間設置RecordVideoOption.setMinDuration(//最小錄制時長(秒數,最小是1,會自動調整不大于最大錄制時長))
2.優化代碼
0.3-beta.2版本更新:
1.重構項目代碼,kotlin改寫部分功能
2.移除rxjava庫,減少依賴
3.升級最新SDK
4.新增閃光燈功能,增加計時前提示文本設置
5.增加國際化支持,英文和中文
6.修復已知問題,優化代碼
7.對外用戶調用API改動較少,主要為內部調整,見下方文檔,歡迎大家測試反饋完善功能
0.2.29版本更新:
1.新增圓形進度按鈕配置功能
2.新增指定前后置攝像頭功能
3.優化代碼,調整啟動視頻錄制配置項
0.2.28版本更新:
1.優化視頻錄制結果獲取方式
2.優化代碼
0.2.27版本更新:
1.視頻錄制界面RecordVideoRequestOption新增RecorderOption和hideFlipCameraButton配置
2.優化代碼
0.2.26版本更新:
1.項目遷移至AndroidX, 引入Kotlin
0.2.25版本更新:
1.優化權限自動申請,可自動調起視頻錄制界面
2.規范圖片資源命名
一.效果展示
仿微信界面視頻錄制
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.3.2'}三.使用
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,實現了仿微信風格的錄制界面
從0.2.18開始改為類似
RecorderManagerFactory.getRecordVideoRequest().startRecordVideo(MainActivity.this, 0);從0.4.0-beta版本開始,因為采用registerForActivityResult,所以直接傳入結果回調
RecorderManagerProvider.getRecordVideoRequester().startRecordVideo(MainActivity.this, new RMRecordVideoResultCallback() {@Overridepublic void onResponseRecordVideoResult(@NonNull RecordVideoResultInfo info) {Log.e("MainActivity", "onActivityResult: " + info.getDuration() + " " + info.getFilePath());Toast.makeText(MainActivity.this, info.getDuration() + " " + info.getFilePath(), Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(@NonNull RecorderManagerException e) {Log.e("MainActivity", "onActivityResult: " + e.getErrorCode() + " " + e.getMessage());}});從0.4.0-beta版本開始:RecorderManagerFactory重命名為RecorderManagerProvider
RecorderManagerFactory中可以拿到IRecordVideoPageRequester,在IRecordVideoPageRequester接口中
從0.4.0-beta版本開始:
public interface IRecordVideoPageRequester extends IRMRequester {/*** 以默認配置打開錄制視頻界面** @param activity Activity* @param callback 視頻錄制結果回調*/void startRecordVideo(@NonNull FragmentActivity activity, @NonNull RMRecordVideoResultCallback callback);/*** 以默認配置打開錄制視頻界面** @param fragment Fragment* @param callback 視頻錄制結果回調*/void startRecordVideo(@NonNull Fragment fragment, @NonNull RMRecordVideoResultCallback callback);/*** 打開錄制視頻界面** @param activity Activity* @param option 視頻錄制請求配置信息類* @param callback 視頻錄制結果回調*/void startRecordVideo(@NonNull FragmentActivity activity, @Nullable RecordVideoRequestOption option, @NonNull RMRecordVideoResultCallback callback);/*** 打開錄制視頻界面** @param fragment Fragment* @param option 視頻錄制請求配置信息類* @param callback 視頻錄制結果回調*/void startRecordVideo(@NonNull Fragment fragment, @Nullable RecordVideoRequestOption option, @NonNull RMRecordVideoResultCallback callback); }RecordVideoRequestOption可配置最大時長(秒)和文件保存路徑
public class RecordVideoRequestOption implements Parcelable {private String filePath;//文件保存路徑private int maxDuration;//最大錄制時間(秒數)private RecordVideoOption recordVideoOption;//錄制視頻配置信息類(里面配置的filePath和maxDuration會覆蓋外面的) }RecordVideoActivity里已經配置好了默認參數,可以直接使用,然后在onActivityResult里拿到視頻路徑的返回值
返回值為RecordVideoResultInfo
從0.4.0-beta.1版本開始:
由于采用Android新API registerForActivityResult,所以startActivityForResult等相關方法皆已廢棄,相關回調將直接通過RMRecordVideoResultCallback傳遞
(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*/public AppCompatImageView getFlipCameraView() {return mRecordVideoFg == null ? null : mRecordVideoFg.getFlipCameraView();}/*** 獲取播放控件** @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();}想要替換圖標資源的話,提供下列名稱圖片
rm_record_video_flip_camera.png rm_record_video_cancel.png rm_record_video_confirm.png rm_record_video_play.png rm_record_video_pull_down.png rm_record_video_flashlight_turn_off.png rm_record_video_flashlight_turn_on.png(3).同時提供了對應的RecordVideoFragment,實現與RecordVideoActivity同樣的功能,實際RecordVideoActivity就是包裹了一個RecordVideoFragment
1.創建RecordVideoFragment
/*** 獲取錄制視頻Fragment實例(使用默認配置項)** @param filePath 存儲文件路徑* @return 返回RecordVideoFragment*/public static RecordVideoFragment newInstance(@Nullable String filePath) {return newInstance(filePath, 30);}/*** 獲取錄制視頻Fragment實例(使用默認配置項)** @param filePath 存儲文件路徑* @param maxDuration 最大時長(秒數)* @return 返回RecordVideoFragment*/public static RecordVideoFragment newInstance(@Nullable 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(@Nullable RecordVideoOption option) {RecordVideoFragment fragment = new RecordVideoFragment();Bundle args = new Bundle();args.putParcelable(BUNDLE_EXTRA_RECORD_VIDEO_OPTION, option == null ? new RecordVideoOption() : option);fragment.setArguments(args);return fragment;}2.然后添加RecordVideoFragment到自己想要的地方就可以了
3.可以設置OnRecordVideoListener,拿到各個事件的回調
原OnRecordVideoListener現已改為RMOnRecordVideoListener,并從RecordVideoOption中移除,主要用于用戶自己activity或fragment實現此接口,用于承載RecordVideoFragment,獲取相關步驟回調
interface RMOnRecordVideoListener {/*** 當完成一次錄制時回調** @param filePath 視頻文件路徑* @param videoDuration 視頻時長(毫秒)*/fun onCompleteRecordVideo(filePath: String?, videoDuration: Int)/*** 當點擊確認錄制結果按鈕時回調** @param filePath 視頻文件路徑* @param videoDuration 視頻時長(毫秒)*/fun onClickConfirm(filePath: String?, videoDuration: Int)/*** 當點擊取消按鈕時回調** @param filePath 視頻文件路徑* @param videoDuration 視頻時長(毫秒)*/fun onClickCancel(filePath: String?, videoDuration: Int)/*** 當點擊返回按鈕時回調*/fun onClickBack() }4.RecordVideoButtonOption是圓形進度按鈕配置類
private @ColorIntint idleCircleColor;//空閑狀態內部圓形顏色private @ColorIntint pressedCircleColor;//按下狀態內部圓形顏色private @ColorIntint releasedCircleColor;//釋放狀態內部圓形顏色private @ColorIntint idleRingColor;//空閑狀態外部圓環顏色private @ColorIntint pressedRingColor;//按下狀態外部圓環顏色private @ColorIntint releasedRingColor;//釋放狀態外部圓環顏色private int idleRingWidth;//空閑狀態外部圓環寬度private int pressedRingWidth;//按下狀態外部圓環寬度private int releasedRingWidth;//釋放狀態外部圓環寬度private int idleInnerPadding;//空閑狀態外部圓環與內部圓形之間邊距private int pressedInnerPadding;//按下狀態外部圓環與內部圓形之間邊距private int releasedInnerPadding;//釋放狀態外部圓環與內部圓形之間邊距private boolean idleRingVisible;//空閑狀態下外部圓環是否可見private boolean pressedRingVisible;//按下狀態下外部圓環是否可見private boolean releasedRingVisible;//釋放狀態下外部圓環是否可見5.RecorderOption是具體的錄制參數配置類
private int audioSource;//音頻源private int videoSource;//視頻源private int outputFormat;//輸出格式private int audioEncoder;//音頻編碼格式private int videoEncoder;//視頻編碼格式private int audioSamplingRate;//音頻采樣頻率(一般44100)private int bitRate;//視頻編碼比特率private int frameRate;//視頻幀率private int videoWidth, videoHeight;//視頻寬高private int maxDuration;//最大時長private long maxFileSize;//文件最大大小private String filePath;//文件存儲路徑private int orientationHint;//視頻錄制角度方向(4).如果想自定義自己的界面,可以直接使用RecorderManagerable類
1.通過RecorderManagerFactory獲取IRecorderManager
從0.4.0-beta版本開始:RecorderManagerFactory重命名為RecorderManagerProvider
它們返回的都是IRecorderManager 接口類型,RecorderManager 是默認的實現類,RecorderManager 內持有一個真正進行操作的RecorderHelper。
public interface IRecorderManager extends IRecorderHelper {/*** 設置錄制對象** @param helper 錄制對象實例*/void setRecorderHelper(@NonNull IRecorderHelper helper);/*** 獲取錄制對象** @return 返回錄制對象實例*/@NonNullIRecorderHelper getRecorderHelper();/*** 初始化相機對象** @param holder Surface持有者* @return 返回初始化好的相機對象*/@NullableCamera initCamera(@NonNull SurfaceHolder holder);/*** 初始化相機對象** @param cameraType 指定的攝像頭類型* @param holder Surface持有者* @return 返回初始化好的相機對象*/@NullableCamera initCamera(@NonNull RecorderManagerConstants.CameraType cameraType, @NonNull SurfaceHolder holder);/*** 打開或關閉閃光燈** @param turnOn true表示打開,false關閉*/boolean switchFlashlight(boolean turnOn);/*** 翻轉攝像頭** @param holder Surface持有者* @return 返回翻轉并初始化好的相機對象*/@NullableCamera flipCamera(@NonNull SurfaceHolder holder);/*** 翻轉到指定類型攝像頭** @param cameraType 攝像頭類型* @param holder Surface持有者* @return 返回翻轉并初始化好的相機對象*/@NullableCamera flipCamera(@NonNull RecorderManagerConstants.CameraType cameraType, @NonNull SurfaceHolder holder);/*** 獲取當前攝像頭類型** @return 返回攝像頭類型*/@NonNullRecorderManagerConstants.CameraType getCameraType();/*** 釋放相機資源*/void releaseCamera();}RecorderManagerIntercept實現IRecorderManagerInterceptor接口,用戶可以直接繼承RecorderManagerIntercept,它里面所有方法都是空實現,可以自己改寫需要的方法
public interface IRecorderManagerInterceptor extends ICameraInterceptor { }IRecorderHelper是一個接口類型,由實現IRecorderHelper的子類來進行錄制操作,默認提供的是RecorderHelper,RecorderHelper實現了IRecorderHelper。
public interface IRecorderHelper {/*** 錄制音頻** @param path 文件存儲路徑* @return 返回是否成功開啟錄制,成功返回true,否則返回false*/boolean recordAudio(@NonNull String path);/*** 錄制音頻** @param option 存儲錄制信息的對象* @return 返回是否成功開啟錄制,成功返回true,否則返回false*/boolean recordAudio(@NonNull RecorderOption option);/*** 錄制視頻** @param camera 相機* @param surface 表面視圖* @param path 文件存儲路徑* @return 返回是否成功開啟錄制,成功返回true,否則返回false*/boolean recordVideo(@Nullable Camera camera, @Nullable Surface surface, @Nullable String path);/*** 錄制視頻** @param camera 相機* @param surface 表面視圖* @param option 存儲錄制信息的對象* @return 返回是否成功開啟視頻錄制,成功返回true,否則返回false*/boolean recordVideo(@Nullable Camera camera, @Nullable Surface surface, @Nullable RecorderOption option);/*** 釋放資源*/void release();/*** 獲取錄制器** @return 返回實例對象*/@NonNullMediaRecorder getMediaRecorder();/*** 獲取配置信息對象** @return 返回實例對象*/@NullableRecorderOption getRecorderOption(); }2.拿到后創建相機對象
if (mCamera == null) {mCamera = mManager.initCamera(mCameraType, svVideoRef.get().getHolder());mCameraType = mManager.getCameraType();}3.錄制
isRecording = mManager.recordVideo(mCamera, svVideoRef.get().getHolder().getSurface(), mOption.getRecorderOption());4.釋放
mManager.release();mManager = null;mCamera = null;四.總結
目前來說,大體流程就是這樣,更詳細的信息請到Github上查看, 后期將添加閃光燈等更多功能,敬請關注,github地址為 https://github.com/MingYueChunQiu/RecorderManager ,碼云地址為 https://gitee.com/MingYueChunQiu/RecorderManager ,如果它能對你有所幫助,請幫忙點個star,有什么建議或意見歡迎反饋。
總結
以上是生活随笔為你收集整理的RecorderManager安卓仿微信自定义音视频录制第三方库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机求正有理数算术平方根的步骤,用计
- 下一篇: 好嗨游戏:20款最好玩的运动游戏:足球、