iis服务器助手广告
返回顶部
首页 > 资讯 > 移动开发 >Android视频录制功能的实现步骤
  • 582
分享到

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

2024-04-02 19:04:59 582人浏览 独家记忆
摘要

官方使用指南请查看Google音频和视频指南 视频录制基本步骤 1.申明权限 <uses-permission Android:name="android.permiss

官方使用指南请查看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;


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;


public class VideoRecorder {
    private static final String TAG = "VideoRecord";
    private MediaRecorder mRecorder;

    public VideoRecorder() {

    }

    
    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());
            }

        }
    }

    
    public boolean pause() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && mRecorder != null) {
            mRecorder.pause();
            return true;
        }
        return false;
    }

    
    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视频录制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android视频录制功能的实现步骤

本文链接: https://www.lsjlt.com/news/123760.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android视频录制功能的实现步骤
    官方使用指南请查看Google音频和视频指南 视频录制基本步骤 1.申明权限 <uses-permission android:name="android.permiss...
    99+
    2024-04-02
  • Windows7 录制器工具录制视频的步骤
    使用电脑时,我们往往会对桌面上的某些操作出现问题,如果当我们面对无法解决的问题束手无策时,这样只好求人上门帮忙了。哎,如今求人难呀,求人上门更难,如果要是远程解决最好了。在Windows7中系统提供了一个“问...
    99+
    2023-05-25
    录制器 录制视频 工具 Windows7 视频 步骤
  • Android实现视频的画中画功能
    简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity。画中画是一种特殊类型的多窗口模式,最常用于视频播放。使用该模式,用户可以通过...
    99+
    2024-04-02
  • 十分钟实现 Android Camera2 视频录制
    1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更...
    99+
    2023-09-08
    android 音视频 相机 Camera 视频录制
  • Android GSYVideoPlayer视频播放器功能的实现
    GSYVideoPlayer GSYVideoPlayer官方地址 GSYVideoPlayer 一个基于IJkPlayer的播放器 支持调节声音亮度 边播边缓存 使用了Andro...
    99+
    2024-04-02
  • android怎么实现视频播放功能
    Android可以使用MediaPlayer或ExoPlayer等库来实现视频播放功能。以下是一种常见的实现方法:1. 添加权限和依...
    99+
    2023-08-23
    android
  • Android仿微信长按录制视频并播放功能
    本文实例为大家分享了Android仿微信长按录制视频并播放功能的具体代码,供大家参考,具体内容如下 一、点击按钮进行录制 首先要获取摄像拍照的权限和读取权限 <uses-p...
    99+
    2024-04-02
  • Android实现实时视频聊天功能源码
    实现实时视频聊天功能的源码在Android平台上可以使用WebRTC技术。下面是一个简单的示例:1. 添加依赖项在项目的build....
    99+
    2023-09-13
    Android
  • Android应用中怎么实现一个录制视频生成GIF图片功能
    今天就跟大家聊聊有关Android应用中怎么实现一个录制视频生成GIF图片功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先打开AS,连接上手机,打开你要录制的程序或者视频打开A...
    99+
    2023-05-31
    android roi
  • Android开发中怎么自定义一个视频录制功能
    本篇文章为大家展示了Android开发中怎么自定义一个视频录制功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android录制视频MediaRecorder+SurfaceView的使用方法&l...
    99+
    2023-05-31
    android roi
  • 安卓使用VLC播放视频,实现截图和录制功能
    VLC是一款非常强大的开源媒体播放器,由VideoLAN组织开发和维护。它最初是为学校项目开发的,但现在已经成为全球最流行的媒体播放器之一。 VLC具有以下几个主要特点: 多平台支持:VLC支持几乎所有主流的操作系统,包括Windows、...
    99+
    2023-09-17
    音视频 vlc RTSP
  • C#中实现登录功能的完整步骤
    1. 准备工作 新建一个数据库StudentDB -- 使用master 数据库 use master go if exists(select *from sysda...
    99+
    2024-04-02
  • Android如何实现下载m3u8视频文件功能
    本篇内容主要讲解“Android如何实现下载m3u8视频文件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何实现下载m3u8视频文件功能”吧!简介Aria下载器采用开源框架A...
    99+
    2023-07-05
  • Vue+node实现音频录制播放功能
    实现效果: 主要实现代码逻辑部分,具体页面结构就不一一介绍了。 vue部分: 安装recorderx cnpm install recorderx --save 或者 ...
    99+
    2024-04-02
  • Python实现多个视频合成一个视频的功能
    目录前言环境依赖代码验证一下前言 本文提供将多个视频拼接为一个视频的Python工具代码,其中有一些限制条件,下面的代码说明会提到。 环境依赖 ffmpeg环境安装,可以参考:win...
    99+
    2024-04-02
  • Android 录制音视频的完整代码
    打开camera private void openCamera(int position) { if (mCamera == null) { mCamera = Ca...
    99+
    2024-04-02
  • vue实现视频上传功能
    本文实例为大家分享了vue实现视频上传功能的具体代码,供大家参考,具体内容如下 环境:vue + TS 上传视频 + 上传到阿里云 主要处理前端在vue下上传视频 使用的是阿里云的视...
    99+
    2024-04-02
  • 微信小程序实现音频录制功能
    微信小程序实现音频录制功能近年来,随着移动互联网的发展,微信小程序的普及越来越广泛。微信小程序作为一种轻量级、易于使用的应用,在帮助企业拓展市场和提升用户体验方面发挥着重要的作用。而在实现音频录制功能方面,微信小程序同样提供了简单易用的接口...
    99+
    2023-11-21
    微信小程序音频录制
  • vue如何实现录制视频并压缩视频文件
    这篇“vue如何实现录制视频并压缩视频文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何实现录制视频并压缩视频文件...
    99+
    2023-07-04
  • Vue+ElementUI实现视频上传功能
    一、前言 项目中需要提供一个视频介绍,使用户能够快速、方便的了解如何使用产品以及注意事项。 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作