因为在项目中经常需要使用音视频录制,所以写了一个公共库 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();
    }
/**
 * 获取圆形进度按钮
 *
 * @<span class="hljs-built_in">return</span> 返回进度CircleProgressButton
 */
protected CircleProgressButton <span class="hljs-function"><span class="hljs-title">getCircleProgressButton</span></span>() {
    <span class="hljs-built_in">return</span> mRecordVideoFg == null ? null : mRecordVideoFg.getCircleProgressButton();
}

/**
 * 获取播放控件
 *
 * @<span class="hljs-built_in">return</span> 返回播放AppCompatImageView
 */
protected AppCompatImageView <span class="hljs-function"><span class="hljs-title">getPlayView</span></span>() {
    <span class="hljs-built_in">return</span> mRecordVideoFg == null ? null : mRecordVideoFg.getPlayView();
}

/**
 * 获取取消控件
 *
 * @<span class="hljs-built_in">return</span> 返回取消AppCompatImageView
 */
protected AppCompatImageView <span class="hljs-function"><span class="hljs-title">getCancelView</span></span>() {
    <span class="hljs-built_in">return</span> mRecordVideoFg == null ? null : mRecordVideoFg.getCancelView();
}

/**
 * 获取确认控件
 *
 * @<span class="hljs-built_in">return</span> 返回确认AppCompatImageView
 */
protected AppCompatImageView <span class="hljs-function"><span class="hljs-title">getConfirmView</span></span>() {
    <span class="hljs-built_in">return</span> mRecordVideoFg == null ? null : mRecordVideoFg.getConfirmView();
}

/**
 * 获取返回控件
 *
 * @<span class="hljs-built_in">return</span> 返回返回AppCompatImageView
 */
protected AppCompatImageView <span class="hljs-function"><span class="hljs-title">getBackView</span></span>() {
    <span class="hljs-built_in">return</span> 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 最大时长(秒数)
 * @<span class="hljs-built_in">return</span> 返回RecordVideoFragment
 */
public static RecordVideoFragment newInstance(String filePath, int maxDuration) {
    <span class="hljs-built_in">return</span> newInstance(new RecordVideoOption.Builder()
            .setRecorderOption(new RecorderOption.Builder().buildDefaultVideoBean(filePath))
            .setMaxDuration(maxDuration)
            .build());
}

/**
 * 获取录制视频Fragment实例
 *
 * @param option 录制配置信息对象
 * @<span class="hljs-built_in">return</span> 返回RecordVideoFragment
 */
public static RecordVideoFragment newInstance(RecordVideoOption option) {
    RecordVideoFragment fragment = new RecordVideoFragment();
    fragment.mOption = option;
    <span class="hljs-keyword">if</span> (fragment.mOption == null) {
        fragment.mOption = new RecordVideoOption();
    }
    <span class="hljs-keyword">if</span> (fragment.mOption.getRecorderOption() == null &amp;&amp; fragment.getContext() != null) {
        File file = fragment.getContext().getExternalFilesDir(Environment.DIRECTORY_MOVIES);
        <span class="hljs-keyword">if</span> (file != null) {
            fragment.mOption.setRecorderOption(new RecorderOption.Builder().buildDefaultVideoBean(
                    file.getAbsolutePath() +
                            File.separator + System.currentTimeMillis() + <span class="hljs-string">".mp4"</span>));
        }
    }
    <span class="hljs-built_in">return</span> 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 实际录制类
 * @<span class="hljs-built_in">return</span> 返回录制管理类实例
 */
public static RecorderManagerable newInstance(Recorderable recorderable) {
    <span class="hljs-built_in">return</span> 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 地址为 github.com/MingYueChun… ,码云地址为 gitee.com/MingYueChun… ,如果它能对你有所帮助,请帮忙点个 star,有什么建议或意见欢迎反馈。

  • Android

    开放手机联盟(一个由 30 多家科技公司和手机公司组成的团体)已开发出 Android,Android 是第一个完整、开放、免费的手机平台。

    293 引用
感谢    赞同    分享    收藏    关注    反对    举报    ...