日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RecorderManager安卓仿微信自定义音视频录制第三方库

發布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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接口中

/*** 以默認配置打開錄制視頻界面** @param activity Activity* @param requestCode 請求碼*/void startRecordVideo(@NonNull FragmentActivity activity, int requestCode);/*** 以默認配置打開錄制視頻界面** @param fragment Fragment* @param requestCode 請求碼*/void startRecordVideo(@NonNull Fragment fragment, int requestCode);/*** 打開錄制視頻界面** @param activity Activity* @param requestCode 請求碼* @param option 視頻錄制請求配置信息類*/void startRecordVideo(@NonNull FragmentActivity activity, int requestCode, @Nullable RecordVideoRequestOption option);/*** 打開錄制視頻界面** @param fragment Fragment* @param requestCode 請求碼* @param option 視頻錄制請求配置信息類*/void startRecordVideo(@NonNull Fragment fragment, int requestCode, @Nullable RecordVideoRequestOption option);

從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

@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK && requestCode == 0) {RecordVideoResultInfo info = data.getParcelableExtra(EXTRA_RECORD_VIDEO_RESULT_INFO);//從0.2.28版本開始可以使用下面這種方式,更安全更靈活,兼容性強RecordVideoResultInfo info = RecorderManagerFactory.getRecordVideoResult(data);//從0.3版本開始RecordVideoResultInfo info = RecorderManagerFactory.getRecordVideoResultParser().parseRecordVideoResult(data);if (info != null) {Log.e("MainActivity", "onActivityResult: " + " "+ info.getDuration() + " " + info.getFilePath());}}}

從0.4.0-beta.1版本開始:
由于采用Android新API registerForActivityResult,所以startActivityForResult等相關方法皆已廢棄,相關回調將直接通過RMRecordVideoResultCallback傳遞

interface RMRecordVideoResultCallback {fun onResponseRecordVideoResult(info: RecordVideoResultInfo)fun onFailure(e: RecorderManagerException) }通過下列IRecordVideoPageRequester相關方法,調用時同時傳入響應結果回調void startRecordVideo(@NonNull FragmentActivity activity, @NonNull RMRecordVideoResultCallback callback);

(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,拿到各個事件的回調

public class RecordVideoOption:private RecorderOption recorderOption;//錄制配置信息private RecordVideoButtonOption recordVideoButtonOption;//錄制視頻按鈕配置信息類private int minDuration;//最小錄制時長(秒數,最小是1,會自動調整不大于最大錄制時長),可以和timingHint配合使用private int maxDuration;//最大錄制時間(秒數)private RecorderManagerConstants.CameraType cameraType;//攝像頭類型private boolean hideFlipCameraButton;//隱藏返回翻轉攝像頭按鈕private boolean hideFlashlightButton;//隱藏閃光燈按鈕private String timingHint;//錄制按鈕上方提示語句(默認:0:%s),會在計時前顯示private String errorToastMsg;//錄制發生錯誤Toast(默認:錄制時間小于1秒,請重試)

原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

public final class RecorderManagerProvider {private RecorderManagerProvider() {}/*** 創建錄制管理類實例(使用默認錄制類)** @return 返回錄制管理類實例*/@NonNullpublic static IRecorderManager newInstance() {return newInstance(new RecorderHelper());}/*** 創建錄制管理類實例(使用默認錄制類)** @param intercept 錄制管理器攔截器* @return 返回錄制管理類實例*/@NonNullpublic static IRecorderManager newInstance(@NonNull IRecorderManagerInterceptor intercept) {return newInstance(new RecorderHelper(), intercept);}/*** 創建錄制管理類實例** @param helper 實際錄制類* @return 返回錄制管理類實例*/@NonNullpublic static IRecorderManager newInstance(@NonNull IRecorderHelper helper) {return newInstance(helper, null);}/*** 創建錄制管理類實例** @param helper 實際錄制類* @param intercept 錄制管理器攔截器* @return 返回錄制管理類實例*/@NonNullpublic static IRecorderManager newInstance(@NonNull IRecorderHelper helper, @Nullable IRecorderManagerInterceptor intercept) {return new RecorderManager(helper, intercept);}@NonNullpublic static IRecordVideoPageRequester getRecordVideoRequester() {return new RecordVideoPageRequester();}@NonNullpublic static IRecordVideoResultParser getRecordVideoResultParser() {return new RecordVideoResultParser();} }

它們返回的都是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安卓仿微信自定义音视频录制第三方库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。