首页 > 其他分享 >Android使用MediaRecorder进行录像,暂停和继续录像的VideoUtils

Android使用MediaRecorder进行录像,暂停和继续录像的VideoUtils

时间:2024-03-20 09:46:43浏览次数:25  
标签:profile MediaRecorder mMediaRecorder VideoUtils 录像 camera fun import

使用MediaRecorder进行录像,要注意再设置MediaRecorder的参数的时候设置,这里也是查了网上很多代码都没有一个完整能实现的,或多或少都有点问题。
还有再暂停/继续录制的时候要注意将Camera的预览关闭camera.stopPreview()不然预览的界面还是会继续动给人暂停了还在录制的错觉。
还有camera再使用之前记得要unlock一下。至于设置MediaRecorder的参数,也是尝试了好多次,最后选择了使用profile选择视频质量来进行配置,这样最简单,可以考虑到视频大小的要求选择默认的 720P等,但是注意要硬件适配的大小。
所以如果出现media start failed,那么可以尝试降低视频录制参数来重新尝试。
完整的VideoUtils代码如下:


import android.hardware.Camera
import android.media.CamcorderProfile
import android.media.MediaRecorder
import android.os.Build
import android.view.Surface
import android.view.TextureView
import com.blankj.utilcode.util.PathUtils
import com.blankj.utilcode.util.PermissionUtils
import com.blankj.utilcode.util.ToastUtils
import java.io.File
import java.io.IOException
import java.lang.Exception

// 签署时候,录制视频的工具,包含录制和播放
class VideoUtils {

    companion object {

        private var instance: VideoUtils ?= null

        fun getInstance(): VideoUtils {
            if (instance == null) {
                instance = VideoUtils()
            }
            return instance!!
        }
    }

    private var camera: Camera? = null

    // 是否正在录制
    var isRecording: Boolean = false
    // 是否开启了录制,初始化并开启录制,之后是暂停
    var started: Boolean = false
    private var mMediaRecorder: MediaRecorder ?= null

    init {
        mMediaRecorder = MediaRecorder()
    }

    private fun configMediaRecorder(textureView: TextureView){
        val videoFile = File(PathUtils.getExternalDownloadsPath(),"record.mp4")
        if (videoFile.exists()){
            videoFile.delete()
        }
        camera = Camera.open(0)
        camera?.stopPreview()
        camera?.unlock()

        val profile = CamcorderProfile.get( 0, CamcorderProfile.QUALITY_480P )

//        val sizeList = camera.parameters.supportedVideoSizes
//        val videoSize = sizeList.first()
        mMediaRecorder?.setCamera(camera)
        mMediaRecorder?.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)//设置音频输入源  也可以使用 MediaRecorder.AudioSource.MIC
        mMediaRecorder?.setVideoSource(MediaRecorder.VideoSource.CAMERA)//设置视频输入源


        mMediaRecorder?.setOutputFormat(profile.fileFormat)//音频输出格式
        mMediaRecorder?.setAudioEncoder(profile.audioCodec)//设置音频的编码格式
        mMediaRecorder?.setVideoEncoder(profile.videoCodec)//设置图像编码格式

        mMediaRecorder?.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight)
        mMediaRecorder?.setVideoFrameRate(profile.videoFrameRate)
        mMediaRecorder?.setVideoEncodingBitRate(profile.videoBitRate)
        mMediaRecorder?.setAudioEncodingBitRate(profile.audioBitRate)

        mMediaRecorder?.setAudioSamplingRate(profile.audioSampleRate)
        mMediaRecorder?.setAudioChannels(profile.audioChannels)

//        mMediaRecorder?.setVideoFrameRate(20)//要录制的视频帧率 帧率越高视频越流畅 如果设置设备不支持的帧率会报错  按照注释说设备会支持自动帧率所以一般情况下不需要设置
//        mMediaRecorder?.setVideoSize(1080,780)//设置录制视频的分辨率  如果设置设备不支持的分辨率会报错
//        mMediaRecorder?.setVideoEncodingBitRate(5 * 100 * 100) //设置比特率,比特率是每一帧所含的字节流数量,比特率越大每帧字节越大,画面就越清晰,算法一般是 5 * 选择分辨率宽 * 选择分辨率高,一般可以调整5-10,比特率过大也会报错
//        mMediaRecorder?.setOrientationHint(360)//设置视频的摄像头角度 只会改变录制的视频文件的角度(对预览图像角度没有效果)

        val surface = Surface(textureView.getSurfaceTexture())
        mMediaRecorder?.setOutputFile(videoFile.getAbsolutePath())//MP4文件保存路径
        mMediaRecorder?.setPreviewDisplay(surface)//设置拍摄预览

    }

    fun startRecorder(textureView: TextureView) {
        try {
            MyPermissionUtils.requestMicrophonePermissions(object: PermissionUtils.SimpleCallback{
                override fun onGranted() {
                    MyPermissionUtils.requestCameraPermissions(object: PermissionUtils.SimpleCallback{
                        override fun onGranted() {
                            try {
                                configMediaRecorder(textureView) //配置MediaRecorder  因为每一次停止录制后调用重置方法后都会取消配置,所以每一次开始录制都需要重新配置一次
                                mMediaRecorder!!.prepare() //准备
                                mMediaRecorder!!.start() //开启
                                isRecording = true
                                started = true
                            } catch (e: Exception) {
                                ToastUtils.showShort(e.message)
                                e.printStackTrace()
                            }
                        }

                        override fun onDenied() {
                            ToastUtils.showShort("请开启录像权限")
                        }

                    })
                }

                override fun onDenied() {
                    ToastUtils.showShort("请开启录音权限")
                }

            })
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    fun stopRecorder() {
        mMediaRecorder!!.stop() //暂停
        mMediaRecorder!!.reset() //重置 重置后将进入空闲状态,再次启动录制需要重新配置MediaRecorder
        camera?.stopPreview()
        camera?.release()
        camera?.lock()
        isRecording = false
        started = false
    }

    fun pauseRecorder() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mMediaRecorder!!.pause() //暂停
            camera?.stopPreview()
            isRecording = false
        }
    }

    fun resumeRecorder() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mMediaRecorder!!.resume() //恢复
            camera?.startPreview()
            isRecording = true
        }
    }

    fun destroy() {
        if (mMediaRecorder != null) {
            mMediaRecorder!!.stop()
            mMediaRecorder!!.release() //释放 释放之前需要先调用stop()
            // 摄像头关闭预览和释放
            camera?.stopPreview()
            camera?.release()
            mMediaRecorder = null
        }
        instance = null
    }

}

标签:profile,MediaRecorder,mMediaRecorder,VideoUtils,录像,camera,fun,import
From: https://www.cnblogs.com/xxss0903/p/18084497

相关文章

  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/
    一、前言用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22)Invali......
  • 安防视频监控云平台EasyCVR v3.5支持批量设置录像计划时间段
    安防视频监控云平台EasyCVR支持多协议接入、可分发多格式的视频流,平台支持高清视频的接入、管理、共享,支持7*24小时不间断监控。视频监控管理平台EasyCVR可提供实时远程视频监控、录像、回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰......
  • EasyDarwin视频直播点播平台:录像管理功能全面解析
    随着网络技术的飞速发展和人们信息获取、娱乐方式的转变,视频直播和点播平台逐渐成为人们日常生活中不可或缺的一部分。在这样的背景下,EasyDarwin作为一款开源且基于云的视频直播和点播平台,凭借其出色的录像管理功能,成为行业的领军者。EasyDarwin的录像管理功能赋予了管理员强大的......
  • 智慧安防/视频监控汇聚平台EasyCVR如何通过接口调用获取设备录像回看流地址?
    视频云存储/视频融合/安防监控EasyCVR视频汇聚系统可兼容各品牌的IPC、NVR、移动单兵、智能手持终端、移动执法仪、无人机、布控球等设备的接入,支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云s......
  • EasyCVR设备录像无法下载是什么原因?该如何解决?
    近期有用户反馈EasyCVR设备录像无法下载,如下图:收到用户反馈后,技术人员立即开展排查。经过排查F12报错与日志后发现,将可下载的录像与无法下载的录像相对比,接口信息缺少字符串,如下:随后继续排查发现,用户设备通道名称携带了特殊字符,与用户沟通后修改即可正常下载了。......
  • 如何配置LiveNVR实现在服务器上多个不同的磁盘目录存储监控摄像头的录像,并支持电脑、
    @目录1、流媒体服务软件2、配置开启录像(云端录像)3、指定录像存储路径4、录像回看(云端录像)4.1、查看录像4.1.1、时间轴视图4.1.2、列表视图5、云端录像相关接口6、如何分享时间轴录像回看?7、iframe集成示例8、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务1、流媒体服务软件LiveNVR......
  • 录像交互
    接口分析 点击搜索u盘文件:请求:类型:POSTURL:http://192.168.1.96/querydata参数page:1rows:10szCmd:{"QueryRecord":{"szStTime":"2024-01-25+00:00:00","szEdTime":"2024-01-25+23:59:59"}}    规律总结录像规律:......
  • Qt编写linux系统onvif工具(支持预览/云台/预置位/录像等)
    一、功能特点广播搜索设备,支持IPC和NVR,依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。可对每个设备设置Onvif用户信息,用于认证获取详细信息......
  • GB28181智慧安防视频监控EasyCVR v3.5系统增加录像保存地址的配置
    智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入。在网络传输上,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷传输,视频流经平台处理后可对外进行多格式的分发,实现多展示终端观看(电脑、大屏、电视墙、手机端等)。国标GB28181协议EasyCVR安......
  • 国标视频监控平台EasyCVR如何通过接口调用下载设备录像文件
    安防监控系统国标GB28181协议EasyCVR视频监控平台采用了开放式的网络结构,平台可支持Windows/Linux(CentOSubuntu)/国产麒麟系统,能在局域网、公网、专网等复杂的网络环境中,将场景中分散的海量网络监控设备进行统一接入与汇聚管理,并能提供实时远程视频监控、视频录像、回放与存储、......