Android音视频之视频采集(系统API预览)

来分享一下 Android 音视频之视频采集(系统 API 预览)的完整攻略。

一、什么是视频采集?

视频采集是将外部环境中的视频信号转换成数字信号的过程,是实现视频录制、视频直播等功能必备的第一步。

二、Android 系统 API 预览实现视频采集

1. 相机设备

Android 的视频采集可通过相机设备实现。要获取相机设备,需要使用 Camera API 或 Camera2 API,其中 Camera2 API 的相机架构与 Camera API 相比,拥有更先进、更灵活的功能,建议优先使用 Camera2 API。

2. 相机预览

要进行视频采集,需要首先进行视频预览。使用 SurfaceView 对象可以实现相机预览:

// 获取 Camera2Manager 实例
mCamera2Manager = new Camera2Manager(context);
// 获取相机预览的 SurfaceView
mPreviewView = findViewById(R.id.preview_view);
// 配置预览 Surface
mCamera2Manager.setPreviewSurface(mPreviewView.getHolder().getSurface());
// 开启相机预览
mCamera2Manager.startPreview();

3. 相机采集

获取到相机预览后,就可以进行视频采集了。通过设置 Camera2 API 的 CaptureRequest.Builder 对象实现:

// 配置视频采集的目标 Surface
mCamera2Manager.setRecordSurface(mMediaRecorder.getSurface());
// 创建视频捕捉请求构建器
mPreviewBuilder = mCamera2Manager.createPreviewBuilder();
// 设置视频的捕捉请求参数
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
// 设置预览 Surface 和采集 Surface
mPreviewBuilder.addTarget(mPreviewView.getHolder().getSurface());
mPreviewBuilder.addTarget(mMediaRecorder.getSurface());

4. 相机拍照

除了视频采集,Android 相机 API 还支持拍照功能。通过设置 CaptureRequest.Builder 对象实现:

// 创建拍照请求构建器
mCaptureBuilder = mCamera2Manager.createCaptureBuilder(CameraDevice.TEMPLATE_STILL_CAPTURE);
// 获取拍照的目标 Surface
mCaptureBuilder.addTarget(mImageReader.getSurface());
// 设置拍照的捕捉参数
mCaptureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mCaptureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mCaptureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 提交拍照请求
mCamera2Manager.capture(mCaptureBuilder.build(), new CameraCaptureSession.CaptureCallback() {
   @Override
   public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
       super.onCaptureCompleted(session, request, result);
       // 拍照完成回调
   }
}, null);

三、示例说明

1. 实现相机预览

在布局文件中添加 SurfaceView 控件:

<SurfaceView
    android:id="@+id/preview_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

在 Activity 中实现相机预览:

private Camera2Manager mCamera2Manager;
private SurfaceView mPreviewView;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mPreviewView = findViewById(R.id.preview_view);

    // 获取 Camera2Manager 实例
    mCamera2Manager = new Camera2Manager(this);
    // 配置预览 Surface
    mCamera2Manager.setPreviewSurface(mPreviewView.getHolder().getSurface());
    // 开启相机预览
    mCamera2Manager.startPreview();
}

2. 视频采集和录制

在 Activity 中实现视频采集和录制:

private Camera2Manager mCamera2Manager;
private MediaRecorder mMediaRecorder;
private SurfaceView mPreviewView;
private CaptureRequest.Builder mPreviewBuilder;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mPreviewView = findViewById(R.id.preview_view);

    // 获取 Camera2Manager 实例
    mCamera2Manager = new Camera2Manager(this);

    // 初始化 MediaRecorder 对象
    mMediaRecorder = new MediaRecorder();
    // 设置 MediaRecorder 音频和视频源
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    // 设置 MediaRecorder 输出格式、编码器、比特率等参数
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(1920, 1080);
    mMediaRecorder.setOutputFile("path/to/video.mp4");
    // 配置 MediaRecorder 的预览和录制 Surface
    mMediaRecorder.setPreviewDisplay(mPreviewView.getHolder().getSurface());

    // 配置视频采集的目标 Surface
    mCamera2Manager.setRecordSurface(mMediaRecorder.getSurface());
    // 创建视频捕捉请求构建器
    mPreviewBuilder = mCamera2Manager.createPreviewBuilder();
    // 设置视频的捕捉请求参数
    mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
    // 设置预览 Surface 和采集 Surface
    mPreviewBuilder.addTarget(mPreviewView.getHolder().getSurface());
    mPreviewBuilder.addTarget(mMediaRecorder.getSurface());

    // 开始录制
    mMediaRecorder.prepare();
    mMediaRecorder.start();
    // 开始采集
    mCamera2Manager.startRecord(mPreviewBuilder.build(), new CameraCaptureSession.StateCallback() {
        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
            try {
                // 提交预览请求
                session.setRepeatingRequest(mPreviewBuilder.build(), null, null);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {

        }
    }, null);
}

四、总结

以上就是 Android 音视频之视频采集(系统 API 预览)的完整攻略及示例说明。视频采集是 Android 音视频功能的核心之一,需要开发者结合实际需求进行深入学习和实践。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android音视频之视频采集(系统API预览) - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Sentry错误日志监控使用方法解析

    Sentry错误日志监控使用方法解析 概述 Sentry是一款主要用于监控和记录应用程序错误的开源软件,它由 Python 实现,可以用于监控多种类型(例如 JavaScript、Python、PHP、Ruby等)的应用程序错误。本文将介绍 Sentry的使用方法,帮助开发者快速上手该工具进行错误日志监控。 Sentry的安装 Sentry支持多种安装方式,…

    人工智能概览 2023年5月25日
    00
  • 快速搭建Node.js(Express)用户注册、登录以及授权的方法

    下面是详细讲解如何快速搭建Node.js(Express)用户注册、登录以及授权的方法的攻略,包含以下内容: 环境准备 安装Express和必要插件 用户注册与登录功能实现 授权功能实现 1. 环境准备 在开始搭建之前,需要准备好Node.js环境和编辑器,推荐使用最新版Node.js和Visual Studio Code编辑器。 2. 安装Express和…

    人工智能概论 2023年5月24日
    00
  • 获取Django项目的全部url方法详解

    下面我将详细讲解”获取Django项目的全部url方法详解”。 前言 在工作中我们经常需要获取Django项目的所有url链接,不仅仅是我们自己定义的url链接,还包括Django内部自带的url链接。这个需求,在做网站地图,爬虫等一些特定的业务逻辑开发中非常常见,本文就是要解决如何获取Django项目的所有url。 获取方式 获取Django项目的所有ur…

    人工智能概论 2023年5月25日
    00
  • Java基于FFmpeg实现Mp4视频转GIF

    下面提供一份“Java基于FFmpeg实现Mp4视频转GIF”的完整攻略,具体过程如下: 安装FFmpeg库 第一步是需要下载和安装FFmpeg库。FFmpeg是一个开源库,支持大多数主流平台上的音频和视频格式。可以从官网下载安装包,并按照官方文档安装。 如果你使用的是Linux操作系统,则可在终端中输入以下命令进行安装: sudo apt-get inst…

    人工智能概览 2023年5月25日
    00
  • python中模块查找的原理与方法详解

    Python中模块查找的原理与方法详解 在Python中,模块是一个包含Python定义和声明的文件。在Python程序设计中,模块起着非常重要的作用,常用于组织代码、提高代码的复用性和可维护性。但是,当我们的程序中使用一个模块时,Python到底是如何去寻找并加载这个模块的呢?接下来,我们将详细讲解Python中模块查找的原理与方法。 模块的查找路径 在P…

    人工智能概览 2023年5月25日
    00
  • Python django实现简单的邮件系统发送邮件功能

    下面是实现Python Django邮件系统的攻略: 1. 安装依赖包 首先要在项目文件夹中打开终端,使用以下命令安装需要的python包: pip install django pip install django-sendgrid-v5 第一个包是Django框架,第二个包是发送邮件所必须的包。 2. 配置Django项目中的设置 在Django项目的“…

    人工智能概览 2023年5月25日
    00
  • ubuntu 18.04 安装opencv3.4.5的教程(图解)

    下面我会详细讲解“Ubuntu 18.04安装OpenCV 3.4.5的教程(图解)”。 1. 下载OpenCV安装包 首先,从OpenCV官网https://opencv.org/releases/下载OpenCV 3.4.5版本。我们选择的是源码形式的安装包。 2. 安装依赖库 在安装OpenCV前,需要先安装一些必要的依赖库,可以通过以下命令完成: s…

    人工智能概览 2023年5月25日
    00
  • python仿evething的文件搜索器实例代码

    下面是详细的讲解“python仿evething的文件搜索器实例代码”的完整攻略: 简介 本文将介绍如何使用Python编写仿Everything文件搜索器的实例代码。Everything是一款非常强大的文件搜索软件,在Windows平台上有大量用户。使用Python编写仿Everything文件搜索器,可以让使用者快速定位自己所需的文件,提高效率。 准备工…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部