博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecorderManager安卓仿微信自定义音视频录制第三方库
阅读量:5944 次
发布时间:2019-06-19

本文共 11326 字,大约阅读时间需要 37 分钟。

因为在项目中经常需要使用音视频录制,所以写了一个公共库RecorderManager,欢迎大家使用。

最新0.2.23版本更新: 1.优化视频录制监听

一.效果展示

仿微信界面视频录制

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.23'	}复制代码

三.使用

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);复制代码

RecorderManagerFactory中可以拿到RequestRecordVideoPageable,在RequestRecordVideoPageable接口中

/**     * 以默认配置打开录制视频界面     *     * @param activity    Activity     * @param requestCode 请求码     */    void startRecordVideo(Activity activity, int requestCode);    /**     * 以默认配置打开录制视频界面     *     * @param fragment    Fragment     * @param requestCode 请求码     */    void startRecordVideo(Fragment fragment, int requestCode);    /**     * 打开录制视频界面     *     * @param activity    Activity     * @param requestCode 请求码     * @param option      视频录制请求配置信息类     */    void startRecordVideo(Activity activity, int requestCode, RecordVideoRequestOption option);    /**     * 打开录制视频界面     *     * @param fragment    Fragment     * @param requestCode 请求码     * @param option      视频录制请求配置信息类     */    void startRecordVideo(Fragment fragment, int requestCode, RecordVideoRequestOption option);复制代码

RecordVideoRequestOption可配置最大时长(秒)和文件保存路径

public class RecordVideoRequestOption implements Parcelable {    private int maxDuration;//最大录制时长    private String filePath;//文件保存路径}复制代码

RecordVideoActivity里已经配置好了默认参数,可以直接使用,然后在onActivityResult里拿到视频路径的返回值 返回值为RecordVideoResultInfo

@Override    protected 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);            Log.e("MainActivity", "onActivityResult: " + " "                    + info.getDuration() + " " + info.getFilePath());        }    }复制代码

(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();    }复制代码

想要替换图标资源的话,提供下列名称图片

record_video_flip_camera.pngrecord_video_cancel.pngrecord_video_confirm.pngrecord_video_play.pngrecord_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() + SUFFIX_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);        /**         * 当点击确认录制结果按钮时回调         *         * @param filePath      视频文件路径         * @param videoDuration 视频时长(毫秒)         */        void onClickConfirm(String filePath, int videoDuration);  /**         * 当点击取消按钮时回调         *         * @param filePath      视频文件路径         * @param videoDuration 视频时长(毫秒)         */        void onClickCancel(String filePath, int videoDuration);        /**         * 当点击返回按钮时回调         */        void onClickBack();    }复制代码

(4).如果想自定义自己的界面,可以直接使用RecorderManagerable类

1.通过RecorderManagerFactory获取RecorderManagerable

public class RecorderManagerFactory {/**     * 创建录制管理类实例(使用默认录制类)     *     * @return 返回录制管理类实例     */    @NonNull    public static RecorderManagerable newInstance() {        return newInstance(new RecorderHelper());    }    /**     * 创建录制管理类实例(使用默认录制类)     *     * @param intercept 录制管理器拦截器     * @return 返回录制管理类实例     */    @NonNull    public static RecorderManagerable newInstance(RecorderManagerInterceptable intercept) {        return newInstance(new RecorderHelper(), intercept);    }    /**     * 创建录制管理类实例     *     * @param recorderable 实际录制类     * @return 返回录制管理类实例     */    @NonNull    public static RecorderManagerable newInstance(Recorderable recorderable) {        return newInstance(recorderable, null);    }    /**     * 创建录制管理类实例     *     * @param recorderable 实际录制类     * @param intercept    录制管理器拦截器     * @return 返回录制管理类实例     */    @NonNull    public static RecorderManagerable newInstance(Recorderable recorderable, RecorderManagerInterceptable intercept) {        return new RecorderManager(recorderable, intercept);    }    @NonNull    public static RequestRecordVideoPageable getRecordVideoRequest() {        return new RecordVideoPageRequest();    }}复制代码

它们返回的都是RecorderManagerable 接口类型,RecorderManager 是默认的实现类,RecorderManager 内持有一个真正进行操作的Recorderable。

public interface RecorderManagerable extends Recorderable {/**     * 设置录制对象     *     * @param recorderable 录制对象实例     */    void setRecorderable(Recorderable recorderable);    /**     * 获取录制对象     *     * @return 返回录制对象实例     */    Recorderable getRecorderable();    /**     * 初始化相机对象     *     * @param holder Surface持有者     * @return 返回初始化好的相机对象     */    Camera initCamera(SurfaceHolder holder);    /**     * 初始化相机对象     *     * @param cameraType 指定的摄像头类型     * @param holder     Surface持有者     * @return 返回初始化好的相机对象     */    Camera initCamera(Constants.CameraType cameraType, SurfaceHolder holder);    /**     * 翻转摄像头     *     * @param holder Surface持有者     * @return 返回翻转并初始化好的相机对象     */    Camera flipCamera(SurfaceHolder holder);    /**     * 翻转到指定类型摄像头     *     * @param cameraType 摄像头类型     * @param holder     Surface持有者     * @return 返回翻转并初始化好的相机对象     */    Camera flipCamera(Constants.CameraType cameraType, SurfaceHolder holder);    /**     * 获取当前摄像头类型     *     * @return 返回摄像头类型     */    Constants.CameraType getCameraType();    /**     * 释放相机资源     */    void releaseCamera();}复制代码

RecorderManagerIntercept实现RecorderManagerInterceptable接口,用户可以直接继承RecorderManagerIntercept,它里面所有方法都是空实现,可以自己改写需要的方法

public interface RecorderManagerInterceptable extends RecorderManagerable, CameraInterceptable {}复制代码

Recorderable是一个接口类型,由实现Recorderable的子类来进行录制操作,默认提供的是RecorderHelper,RecorderHelper实现了Recorderable。

public interface Recorderable {/**     * 录制音频     *     * @param path 文件存储路径     * @return 返回是否成功开启录制,成功返回true,否则返回false     */    boolean recordAudio(String path);    /**     * 录制音频     *     * @param option 存储录制信息的对象     * @return 返回是否成功开启录制,成功返回true,否则返回false     */    boolean recordAudio(RecorderOption option);    /**     * 录制视频     *     * @param camera  相机     * @param surface 表面视图     * @param path    文件存储路径     * @return 返回是否成功开启录制,成功返回true,否则返回false     */    boolean recordVideo(Camera camera, Surface surface, String path);    /**     * 录制视频     *     * @param camera  相机     * @param surface 表面视图     * @param option  存储录制信息的对象     * @return 返回是否成功开启视频录制,成功返回true,否则返回false     */    boolean recordVideo(Camera camera, Surface surface, RecorderOption option);    /**     * 释放资源     */    void release();    /**     * 获取录制器     *     * @return 返回实例对象     */    MediaRecorder getMediaRecorder();    /**     * 获取配置信息对象     *     * @return 返回实例对象     */    RecorderOption 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地址为 ,码云地址为 ,如果它能对你有所帮助,请帮忙点个star,有什么建议或意见欢迎反馈。

转载地址:http://awkxx.baihongyu.com/

你可能感兴趣的文章
PypeR
查看>>
新浪微博布局学习——活用RelativeLayout
查看>>
第46周星期二
查看>>
Tomcat虚拟子目录
查看>>
REVIT参数化有什么意义
查看>>
将python3.1+pyqt4打包成exe
查看>>
解释器中对 标号 的使用
查看>>
分享:FireBreath 1.7.0 RC1 发布
查看>>
<<Information Store and Management>>读书笔记 之五
查看>>
2012年50个顶级的photoshop教程:(一)图形绘画类
查看>>
数据库和c#类型映射
查看>>
(转)swc与swf的区别
查看>>
javascript-Array类型 二
查看>>
Jie Bao 牛人cv
查看>>
海量数据处理的 Top K算法(问题) 小顶堆实现
查看>>
HTC 通过 WifiConfiguration 修改 SSID
查看>>
substring
查看>>
Java抽象类和接口的区别(好长时间没看这种文章了)
查看>>
markdown语法
查看>>
oracle11g dataguard 完全手册
查看>>