登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 204|回复: 0

RecorderManager安卓仿微信自定义音视频录制

[复制链接]

5

主题

60

帖子

619

安币

代码手工艺人

Rank: 4

发表于 2019-1-30 18:40:01 | 显示全部楼层 |阅读模式
如果对本篇文章感兴趣,请前往,原文地址:http://www.apkbus.com/blog-603809-79466.html

因为在项目中经常需要使用音视频录制,所以写了一个公共库RecorderManager,欢迎大家使用。## 一.效果展示仿微信界面视频录制![图片描述](/data/attachment/album/201901/30/183801q9k570pfknlxr9p9.jpg)![图片描述](/data/attachment/album/201901/30/183806tcs50s95gjh53jxs.jpg)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.pngrecord_video_confirm.pngrecord_video_play.pngrecord_video_pull_down.png```#### (3).同时提供了对应的RecordVideoFragment,实现与RecordVideoActivity同样的功能,实际RecordVideoActivity就是包裹了一个RecordVideoFragment1.创建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,有什么建议或意见欢迎反馈。  继续阅读全文



想在安卓巴士找到更多优质博文,可移步博客区

如果对本篇文章感兴趣,请前往,
原文地址:
http://www.apkbus.com/blog-603809-79466.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表