Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]

Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]前言:本章是针对相机系列一衍生的,都是基于camera自定义的。可能网上也有很多资料或者文章,但是看完这两篇文章,你也肯定学会了自定义相机这块(仿微信点击拍照,长按录制);而且我觉得我文章的最大优势是用最简单的语言去描述代码。那么接下来同样是图文并茂。如果大家没有看相机系列一,…

前言:本章是针对相机系列一衍生的,都是基于camera自定义的。可能网上也有很多资料或者文章,但是看完这两篇文章,你也肯定学会了自定义相机这块(仿微信点击拍照,长按录制);而且我觉得我文章的最大优势是用最简单的语言去描述代码。那么接下来同样是图文并茂。如果大家没有看相机系列一,建议去看看。我这里会直接开始讲视频这块的。

本章2节:
自定义相机拍照,及调用系统相机 — 相机系列(1)
自定义相机录制,及调用系统录制 — 相机系列(2)

先看看最终实现的效果

点击拍照 长按录制视频
Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]
Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]

一、点击拍照

本章只讲视频录制,点击拍照请看相机系列(1)

二、录制视频

视频录制是基于 之前相机系列(1)讲的。所以最好把之前的文章看一遍。首先系统提供了MediaRecorder类,供我们录制视频。直接来到我们之前的CameraInterface管理类里。记得一定要按照这个顺序来,且记得加上之前相机权限和音频权限

2.1、准备录制视频,prepareVideoRecorder(SurfaceHolder surfaceHolder)

    public boolean prepareVideoRecorder(SurfaceHolder surfaceHolder) {
        //视频存放的路径
        videoPath = context.getFilesDir().getAbsolutePath().toString() + "/" + TimeUtils.getDateToStringLeo(System.currentTimeMillis() + "") + "_atmancarm.mp4";

        mMediaRecorder = new MediaRecorder();
        // Step 1: Unlock and set camera to MediaRecorder
        mCamera.unlock();
        //将camera设置给MediaRecorder
        mMediaRecorder.setCamera(mCamera);

        // Step 2: Set sources
        //设置音频资源,所以记得打开音频权限android.permission.RECORD_AUDIO
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        //设置录像资源
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        // Step 4: Set output file
        mMediaRecorder.setOutputFile(videoPath);

        // Step 5: Set the preview output
        mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        
        //这里和拍照一个概念,如果不旋转方向,那么拍摄出来的视频都是横屏的。
        //这里唯一存在的问题的,前置录制视频时会出现镜像问题。可以利用FFmpeg解决。本章讲的是录制,这个问题就留着了
        if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
            mMediaRecorder.setOrientationHint(90);
        } else if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            mMediaRecorder.setOrientationHint(270);
        }


        // Step 6: Prepare configured MediaRecorder
        try {
            mMediaRecorder.prepare();
        } catch (IllegalStateException e) {
            //释放mMediaRecorder
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            releaseMediaRecorder();
            return false;
        }
        return true;
    }

2.2、开始录制,startRecord()

    public void startRecord() {
        //录制
        mMediaRecorder.start();
    }

2.3、停止录制,stopRecod()

public String stopRecod() {
        //停止录制,即是录制完成,我们将路径return出去。如果大家想做视频编辑,可以去了解FFmpeg
        mMediaRecorder.stop();
        return videoPath;
    }

2.4、释放mMediaRecorder,releaseMediaRecorder()

    public void releaseMediaRecorder() {
        if (mMediaRecorder != null) {
            mMediaRecorder.reset();   // clear recorder configuration
            mMediaRecorder.release(); // release the recorder object
            mMediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

2.5、简单录制我们的视频

因为我为了代码分离,把所有管理代码放在CameraInterface,同时自定义CameraView起调用作用,避免我们的activity直接出现CameraInterface,这样代码也更佳清晰。

录制视频直接调用:cameraView.startRecord();
录制完成直接调用:String path = binding.cameraView.stopRecod();path即是视频路径

三、预览视频界面

Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]

本来用系统的MediaController配合VideoView就能实现下面的效果。奈何比较丑,所以我用线程和ui自定义了一个。

使用VideoView注意一下几点

  • 设置播放路径
//如果是网络路径,那么转换成uri
videoView.setVideoPath(path);

  • 暂停和播放
 //开始播放
 binding.videoView.start();
 //暂停
 binding.videoView.pause();
 //跳都某个时刻播放,毫秒数
 binding.videoView.seekTo(currentPosition);

  • 设置循环播放
        binding.videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //设置循环播放
                mp.setLooping(true);
            }
        });

  • 释放
 @Override
    protected void onDestroy() {
        super.onDestroy();
        binding.videoView.suspend();
    }

  • 播放路径出错,自带会弹出无法播放此视频,我们点击确定的时候,播放不了,那么取消系统的,加上自己的。点确定后退出界面
binding.videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                // 这里加上你自定义的dialog作操作
                // 这里return true后,就不弹出系统的无法播放此视频的弹窗
                return true;
            }
        });

四、调用系统相机录制,并获取录制视频路径

直接调用下面代码调用

    Intent intentVideo = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    startActivityForResult(intentVideo, CAMERA_VIDEO_PATH);

在onActivityResult获取视频路径

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == CAMERA_VIDEO_PATH) {
                //获取视频路径
                String path = data.getData().toString();
                VideoPlayActivity.startActivity(SystemCameraActivity.this, path);
            }
        }
    }

本github地址

如果你也是一个爱学习,并想学习的话。那么携手共进吧,下面是我的公众号

Andorid自定义相机,点击拍照,长按录制以及调用系统相机录制(相机系列二)[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13826.html

(0)

相关推荐

  • 数据库知识扫盲,数据库索引[通俗易懂]

    数据库知识扫盲,数据库索引[通俗易懂]1、存储引擎 早期存储引擎都是把数据库相关数据固化到磁盘的,在并发上每张表都是表锁, 后期的存储引擎(例如innodb,in-memory等)大多都是元数据在磁盘上,索引数据在内存中,在并发上每张表都

    2023-04-21
    133
  • sql数据库无法连接到服务器_sqlserver无法启动服务

    sql数据库无法连接到服务器_sqlserver无法启动服务我们将 身份验证 选择为 SQL Server 身份验证。输入刚刚创建的用户名和密码: 但是现在还是不能直接使用,因为权限问题。你会看到下面的错误提示框: 解决问题的方法

    2023-06-17
    147
  • mysql 5.7.25 解压版安装-主从同步配置

    mysql 5.7.25 解压版安装-主从同步配置#锁定主数据库 flush tables with read lock #验证结果 INSERT INTO `kettle`.`user_copy` (`id`, `name`, `telphone…

    2023-02-12
    145
  • mysql读写慢_docker清除缓存

    mysql读写慢_docker清除缓存Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS

    2023-05-19
    143
  • 高级玩家必备:深度剖析 MySQL 事务隔离「建议收藏」

    高级玩家必备:深度剖析 MySQL 事务隔离「建议收藏」如果对一个唯一索引使用了唯一的检索条件,那么只需要锁定相应的索引记录就好;如果是没有使用唯一索引作为检索条件,或者用到了索引范围扫描,那么将会使

    2023-05-23
    153
  • 广州开玻璃制品发票-百度知道

    广州开玻璃制品发票-百度知道广州开玻璃制品发票【电+徴亻言; 132 * 50 52 * 90 89】罗经理,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,是A…

    2023-02-02
    155
  • Python爬虫入门指南

    Python爬虫入门指南随着互联网技术的快速发展,数据已经成为当今社会的核心资源之一。在数据收集和分析领域,爬虫作为一种强大的工具被广泛使用。特别是在人工智能这个领域上,爬虫的应用更加重要。Python作为一种流行的编程语言,提供了一些很好的库和工具,使得编写高效的爬虫更加容易。本文就是一篇关于Python爬虫入门指南,将介绍如何使用Python来构建一个基本的爬虫,可以帮助初学者更好地理解爬虫的原理和实现。

    2024-05-11
    87
  • mysql 8.0 忘记root密码后重置[通俗易懂]

    mysql 8.0 忘记root密码后重置[通俗易懂]最近状态很不好,一直晕晕晕晕晕晕乎乎的,一个测试实例,下班前修改了一下root的密码,接着就下班走人,第二天来发现root密码忘了 刚好自动化安装脚本整理好了,本来想着算了直接重装实例得了,简单省事也

    2022-12-22
    145

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注