Android-摄像头全解析之-Video应用

Android-摄像头全解析之-启用系统Video应用

    • 前言
    • 启动系统录制应用
    • 自定义录制小视频

前言

GitHub源代码
随着市面上越来越多的复杂应用出现,录制视频也是一个常用的社交功能点,这篇文章就来探讨一下,如何启用Android系统的应用,以及关于Android方面录制的相关信息。

启动系统录制应用

系统录制应用的注意事项和步骤几乎和拍照的一模一样,详细的步骤我就不详细说明了,有兴趣的伙伴可以先移步拍照系统应用进行详细了解。
启动录制应用也需要使用隐式启动:

 fun takeVideo(){
        Intent(MediaStore.ACTION_VIDEO_CAPTURE).also {taskIntent->
            taskIntent.resolveActivity(packageManager)?.also {
                val photoFile=try {
                    createImageFiles()
                }catch (ex:IOException){
                    null
                }
                Log.d("test",photoFile?.toString())
                photoFile?.also {
                    val photoURI=FileProvider.getUriForFile(this,"com.lyc.indonesia.mediademo",it)
                    taskIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI)
                    startActivityForResult(taskIntent,REQUEST_VIDEO_CAPTURE)
                }
            }
        }
    }

该代码跟启动拍照几乎一模一样,创建自定义文件,判断是否存在系统应用,开启启动,唯一的变化在于action使用的是MediaStore.ACTION_VIDEO_CAPTURE常量。录制完毕后也是使用**Intent.getData()**获取到文件路径URI。

自定义录制小视频

自定义视频和自定义拍照有很多类似的流程,我们可以通过回归以下自定义拍照界面的流程,自定义拍照。
下面我们来整理以下自定义录制小视频的流程:

  • 配置摄像头、音频、外存写入权限,Android6.0考虑运行时权限
  • 打开摄像头,配置相关参数
  • 开启录制视频
  • 停止录制视频
  • 到对应的文件夹查看视频文件

从流程中,我们就可以比较出,自定义视频和自定义拍照前边的流程基本一致,那我们本文重点把精力内容放在录制视频这一块。Android 录制视频需要用到一个辅助类MediaRecorder:

  • Camera.unlock()释放锁定,让MediaRecorder可以开始录制
  • MediaRecorder 做预处理相关配置
  • MediaRecorder 开启录制
  • MediaRecorder 停止录制
  • Camera.lock() 再次锁定
  • 释放MediaRecorder资源

根据以上流程,我们开始第一步进行Camera.unlock()释放锁定 and 做预处理:

    public fun prepareVideoRecorder(): Boolean {
        if (TextUtils.isEmpty(mPath)) {
            return false
        }

        val mSaveFile = createFile(mPath)
        mMediaRecoder = MediaRecorder()
        if (mMediaRecoder == null) {
            return false
        }
        //解锁资源,让MediaRecoder可用
        mCamera?.unlock()
        //设置MediaRecoder绑定的Camera
        mMediaRecoder?.setCamera(mCamera)
        //设置声频来源于扬声器
        mMediaRecoder?.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
        //设置图像来源于视频
        mMediaRecoder?.setVideoSource(MediaRecorder.VideoSource.CAMERA)
        //设置图片协议配置
        mMediaRecoder?.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))
        //设置视频输出文件
        mMediaRecoder?.setOutputFile(mSaveFile)
        //设置预览View对象
        mMediaRecoder?.setPreviewDisplay(surfaceView.holder.surface)

        try {
            //开始预处理
            mMediaRecoder?.prepare()
        } catch (e: IllegalStateException) {
            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.message)
            releaseMediaRecorder()
            return false;
        } catch (e: IOException) {
            Log.d(TAG, "IOException preparing MediaRecorder: " + e.message)
            releaseMediaRecorder()
            return false
        }
        return true

    }

预处理主要设置绑定Camera进行关联、设置资源来源、设置输出文件、设置相关预览对象等,
做完预处理后,我们就进行录制了,程序中我使用isRecording是否正在录制,true为正在录制,为按钮设置以下程序:

            if (isRecording) {
                mMediaRecoder?.stop()
                releaseMediaRecorder()
                mCamera?.lock()
                isRecording = false
                btn_capture.text = "开始录制"
            } else {
                if (prepareVideoRecorder()) {
                    mMediaRecoder?.start()
                    isRecording = true
                    btn_capture.text = "停止录制"
                } else {
                    releaseMediaRecorder()
                }

            }

如果isRecording为True,说明正在录制,我们需要停止录制并释放资源,如果还没有开始录制,就预处理,如果预处理返回结果正确就启动录制,否则进行资源回收,整个自定义的过程就已经结束了,大伙们可以根据自己想要的UI进行自定制,模型已经完成。

你可能感兴趣的:(android开发)