Android视频录制功能的实现步骤

官方使用指南请查看Google音频和视频指南

视频录制基本步骤

1.申明权限

 <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <--如果录制的视频保存在外部SD卡,还需要添加以下权限->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

注意:RECORD_AUDIO为危险权限,从Android 6.0开始(API级别23)开始,需要动态获取。

2.视频录制参数配置

import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.text.TextUtils;

/**
 * @author Created by LRH
 * @description 视频录制参数(参数可自行拓展)
 * @date 2021/1/19 13:54
 */
public class VideoRecorderConfig {
	//Camera
    private Camera camera;
    //摄像头预览宽度
    private int videoWidth;
    //摄像头预览高度
    private int videoHeight;
    //摄像头预览偏转角度
    private int cameraRotation;
    //保存的文件路径
    private String path;
    //由于Camera使用的是SurfaceTexture,所以这里使用了SurfaceTexture
    //也可使用SurfaceHolder
    private SurfaceTexture mSurfaceTexture;

    private int cameraId = 0;

    public SurfaceTexture getSurfaceTexture() {
        return mSurfaceTexture;
    }

    public void setSurfaceTexture(SurfaceTexture surfaceTexture) {
        mSurfaceTexture = surfaceTexture;
    }

    public Camera getCamera() {
        return camera;
    }

    public void setCamera(Camera camera) {
        this.camera = camera;
    }

    public int getVideoWidth() {
        return videoWidth;
    }

    public void setVideoWidth(int videoWidth) {
        this.videoWidth = videoWidth;
    }

    public int getVideoHeight() {
        return videoHeight;
    }

    public void setVideoHeight(int videoHeight) {
        this.videoHeight = videoHeight;
    }

    public int getCameraRotation() {
        return cameraRotation;
    }

    public void setCameraRotation(int cameraRotation) {
        this.cameraRotation = cameraRotation;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int getCameraId() {
        return cameraId;
    }

    public void setCameraId(int cameraId) {
        this.cameraId = cameraId;
    }

    public boolean checkParam() {
        return mSurfaceTexture != null && camera != null && videoWidth > 0 && videoHeight > 0 && !TextUtils.isEmpty(path);
    }
}

3.视频录制接口封装(使用MediaRecorder

import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.view.Surface;

import com.emp.yjy.baselib.utils.LogUtils;
import java.io.IOException;

/**
 * @author Created by LRH
 * @description
 * @date 2021/1/19 13:53
 */
public class VideoRecorder {
    private static final String TAG = "VideoRecord";
    private MediaRecorder mRecorder;

    public VideoRecorder() {

    }

    /**
     * 开始录制
     *
     * @param config
     * @return
     */
    public boolean startRecord(VideoRecorderConfig config, MediaRecorder.OnErrorListener listener) {
        if (config == null || !config.checkParam()) {
            LogUtils.e(TAG, "参数错误");
            return false;
        }
        if (mRecorder == null) {
            mRecorder = new MediaRecorder();
        }
        mRecorder.reset();
        if (listener != null) {
            mRecorder.setOnErrorListener(listener);
        }

        config.getCamera().unlock();
        mRecorder.setCamera(config.getCamera());
        //设置音频通道
//        mRecorder.setAudioChannels(1);
        //声音源
//        AudioSource.DEFAULT:默认音频来源
//        AudioSource.MIC:麦克风(常用)
//        AudioSource.VOICE_UPLINK:电话上行
//        AudioSource.VOICE_DOWNLINK:电话下行
//        AudioSource.VOICE_CALL:电话、含上下行
//        AudioSource.CAMCORDER:摄像头旁的麦克风
//        AudioSource.VOICE_RECOGNITION:语音识别
//        AudioSource.VOICE_COMMUNICATION:语音通信
        mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        //视频源
        mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        try {
            //推荐使用以下代码进行参数配置
            CamcorderProfile bestCamcorderProfile = getBestCamcorderProfile(config.getCameraId());
            mRecorder.setProfile(bestCamcorderProfile);
        } catch (Exception e) {
            //设置输出格式
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            //声音编码格式
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            //视频编码格式
            mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
        }

        //设置视频的长宽
        mRecorder.setVideoSize(config.getVideoWidth(), config.getVideoHeight());
//        设置取样帧率
        mRecorder.setVideoFrameRate(30);
//        mRecorder.setAudioEncodingBitRate(44100);
//        设置比特率(比特率越高质量越高同样也越大)
        mRecorder.setVideoEncodingBitRate(800 * 1024);
//        这里是调整旋转角度(前置和后置的角度不一样)
        mRecorder.setOrientationHint(config.getCameraRotation());
//        设置记录会话的最大持续时间(毫秒)
        mRecorder.setMaxDuration(15 * 1000);
        //设置输出的文件路径
        mRecorder.setOutputFile(config.getPath());
        //设置预览对象(可以使用SurfaceHoler代替)
        mRecorder.setPreviewDisplay(new Surface(config.getSurfaceTexture()));
        //预处理
        try {
            mRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        //开始录制
        mRecorder.start();
        return true;
    }

    /**
     * 停止录制
     */
    public void stopRecord() {
        if (mRecorder != null) {
            try {
                mRecorder.stop();
                mRecorder.reset();
                mRecorder.release();
                mRecorder = null;
            } catch (Exception e) {
                e.printStackTrace();
                LogUtils.e(TAG, e.getMessage());
            }

        }
    }

    /**
     * 暂停录制
     *
     * @return
     */
    public boolean pause() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && mRecorder != null) {
            mRecorder.pause();
            return true;
        }
        return false;
    }

    /**
     * 继续录制
     *
     * @return
     */
    public boolean resume() {
        if (mRecorder != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mRecorder.resume();
            return true;
        }
        return false;
    }
}

public CamcorderProfile getBestCamcorderProfile(int cameraID){
		CamcorderProfile profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_LOW);
		if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_480P)){
			//对比下面720 这个选择 每帧不是很清晰
			profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_480P);
			profile.videoBitRate = profile.videoBitRate/5;
			return profile;
		}
		if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_720P)){
			//对比上面480 这个选择 动作大时马赛克!!
			profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_720P);
			profile.videoBitRate = profile.videoBitRate/35;
			return profile;
		}
		if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_CIF)){
			profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_CIF);
			return profile;
		}
		if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_QVGA)){
			profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_QVGA);
			return profile;
		}
		return profile;
	}

3.使用示例

public void recordVideo(CustomCameraView CameraView) {
        VideoRecorderConfig config = new VideoRecorderConfig();
        String path = App.sGlobalContext.getExternalFilesDir("video").getAbsolutePath() + File.separator + "test1.mp4";
        config.setCamera(CameraView.getCamera());
        config.setCameraRotation(CameraView.getCameraRotation());
        config.setVideoHeight(CameraView.getCameraSize().height);
        config.setVideoWidth(CameraView.getCameraSize().width);
        config.setPath(path);
        config.setSurfaceTexture(CameraView.getSurfaceTexture());
        config.setCameraId(0);
        VideoRecorder record = new VideoRecorder();
        boolean start = record.startRecord(config, null);
        int duration = 15_000;
        while (duration > 0) {
            if (duration == 10_000) {
                boolean pause = record.pause();
                LogUtils.e(TAG, "暂停录制" + pause);
            }
            if (duration == 5_000) {
                boolean resume = record.resume();
                LogUtils.e(TAG, "重新开始录制" + resume);
            }
            SystemClock.sleep(1_000);
            duration -= 1_000;
        }

        record.stopRecord();
        LogUtils.d(TAG, "停止录制");
    }

其中CustomCameraView为自己封装的相机库

到此这篇关于Android视频录制功能的实现步骤的文章就介绍到这了,更多相关Android视频录制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android使用MediaRecorder类进行录制视频

    我们提醒大家使用MediaRecorder录音录像的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源,音频源,即输入源 2.设置输出格式 3.设置音视频的编码格式 一.首先看布局文件,这里有一个SurfaceView,这是一个绘制容器,可以直接从内存或者DMA等硬件接口取得图像数据, <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool

  • 汇总Android视频录制中常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程     以微信为例,其录制触发为按下(住)录制按钮,结束录制的触发条件为松开录制按钮或录制时间结束,其流程大概可以用下图来描述. 1.1.开始录制    根据上述流程及项目的编程惯例,可在onCreate()定义如下函数来完成功能: 初始化过程主要包括View,Data以及Listener三部分.在初始化View时,添加摄像头预览,

  • Android实现拍照和录制视频功能

    本文实例为大家分享了Android实现拍照和录制视频功能的具体代码,供大家参考,具体内容如下 文档中的Camera 要使用Camera,首先我们先看一下文档中是怎么介绍的.相对于其他绝大多数类,文档对Camera的介绍还是比较详尽的,包含了使用过程中所需要的步骤说明,当然,这也表明了它在实际使用中的繁琐. 首先,需要在AndroidManifest.xml中声明以下权限和特性: <uses-permission android:name="android.permission.CAMERA

  • Android自定义录制视频功能

    Android录制视频MediaRecorder+SurfaceView的使用方法,供大家参考,具体内容如下 先看效果图: <1>将视频动画显示到SurfaceView控件上 <2>使用MediaRecorder类进行视频的录制 常用的方法: mediaRecorder.reset(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频 mediaRecorder.setAudioS

  • Android仿微信录制小视频

    本文实例为大家分享了Android仿微信录制小视频的具体代码,供大家参考,具体内容如下 先上张图片看看效果 简单叙述下 首先通过Camera类调用系统相机 通过surfaceview绘制出来 通过MediaRecorder来录制视频 闪光灯 和 切换摄像头 需要重新配置Camera的参数 Camera预览界面画面拉升的原因是因为Surfaceview的大小与设定的比例不一致的 **本次版本更新了 切换前置摄像头录制视频问题 Android部分手机录制视频适配IOS手机问题 (OPPO手机部分不适

  • Android 录制手机屏幕视频生成GIF图片实例详解

    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不是很方便.想CSDN这样的博客网站也并不支持在博客里放视频这种方式,除非你贴外链,太烦了不是么.最好是如下图这种gif方式,直观 今天来教大家一个易操作的录制方式.当然,一般只适合Android开发者.因为你需要有AndroidStudio 工具 AndroidStudio(完成手机屏幕的视频录制,

  • Android 微信小视频录制功能实现详细介绍

    Android 微信小视频录制功能 开发之前 这几天接触了一下和视频相关的控件, 所以, 继之前的微信摇一摇, 我想到了来实现一下微信小视频录制的功能, 它的功能点比较多, 我每天都抽出点时间来写写, 说实话, 有些东西还是比较费劲, 希望大家认真看看, 说得不对的地方还请大家在评论中指正. 废话不多说, 进入正题. 开发环境 最近刚更新的, 没更新的小伙伴们抓紧了 Android Studio 2.2.2 JDK1.7 API 24 Gradle 2.2.2 相关知识点 视频录制界面 Surf

  • 解决Android MediaRecorder录制视频过短问题

    具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩.  错误信息: java.lang.RuntimeException: stop failed. at android.media.MediaRecorder.stop(Native Method)  解决办法: 在stop以前调用setOnErrorListener(null);就行了! 相关代码: /** 开始录制 */ @Override public MediaPar

  • Android使用MediaRecorder类实现视频和音频录制功能

    一.前期基础知识储备 Android提供了MediaRecorder这一个类来实现视频和音频的录制. 由官方配图可知,MediaRecorder用于录制视频时需要调用一系列的API来设置和录制相关的配置,而且调用方法的顺序是固定的,必须按照这个顺序进行API调用才能正确利用手机摄像头实现录像功能. 调用MediaRecorder的录像API顺序如下: 1)Open Camera - Use the Camera.open() to get an instance of the camera ob

  • Android视频录制功能的实现步骤

    官方使用指南请查看Google音频和视频指南 视频录制基本步骤 1.申明权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> <--如果录制的视频保存在外部SD卡,还需要添加以下权限-> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 注意:

  • iOS仿微信相机拍照、视频录制功能

    网上有很多自定义相机的例子,这里只是我临时写的一个iOS自定义相机(仿微信)拍照.视频录制demo,仅供参考: 用到了下面几个库: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> 在使用的时候需要在Info.plist中把相关权限写进去: Privacy - Microphone Usage Description Privacy - Photo Library Usage

  • iOS AVCaptureSession实现视频录制功能

    本文实例为大家分享了AVCaptureSession实现视频录制功能的具体代码,供大家参考,具体内容如下 #import "RecordingVideoViewController.h" #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> @interface RecordingVideoViewController ()<AVCaptureFileOu

  • 基于AForge实现C#摄像头视频录制功能

    本文为大家分享了AForge实现C#摄像头视频录制功能的具体方法,供大家参考,具体内容如下 1. 概述 最近由于兴趣学习了下在C#上使用AForge录制摄像头视频并压缩编码.总体上来说这个第三方.net视觉开发库还是比较稳定的(AForge lib下载.离线帮助文档下载).但是由于这个第三方库维护不怎么样,导致会出现不兼容的问题.这里将这些与大家分享,希望对您有帮助. 在使用AForge第三方库录制本地视频所要使用到的类主要有这几个:FilterInfoCollection.VideoCaptu

  • 详解Ubuntu18.04下配置Nginx+RTMP+HLS+HTTPFLV服务器实现点播/直播/录制功能

    2019.9.4更新 继续玩又发现个好玩的东西,nginx-http-flv-module模块,集成了之前的RTMP模块,又有httpflv模块,还是咱们国内程序员大神开发维护,真是开心,国内的大神如此出色,为他们这些愿意分享技术的人点32个赞,具体的编译和安装方式与RTMP模块基本一样,配置readme中也说得很详细,就不赘述了,需要注意的一点是,httpflv方式客户端想看也是需要服务设置cors的,这点readme中没有提到好像. 2019.6.27更新 再更新个windows版本的搭建方

  • Android实现屏幕录制功能

    本文实例为大家分享了Android实现屏幕录制功能的具体代码,供大家参考,具体内容如下 1.效果图: 2.添加依赖 dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompa

随机推荐