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

yizhihongxing

来分享一下 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日

相关文章

  • Python3.10动态修改Windows系统本地IP地址

    以下是Python3.10动态修改Windows系统本地IP地址的完整攻略: 简介 Python3.10提供了socket库,可以用来动态修改Windows系统本地IP地址。通过Python脚本实现动态修改IP地址,可以方便地管理多个设备,提高生产效率。 步骤 导入socket库 import socket 获取本地主机名 hostname = socket…

    人工智能概览 2023年5月25日
    00
  • ubuntu系统中nginx启动脚本

    让我来为您详细讲解在Ubuntu系统中启动Nginx的脚本。 1. 安装Nginx 在安装Nginx之前,请确保已经安装了Ubuntu系统,并具有sudo权限。在安装Nginx之前,您需要使用以下命令更新你的系统: sudo apt update sudo apt upgrade 接下来,运行以下命令以安装Nginx: sudo apt install ng…

    人工智能概览 2023年5月25日
    00
  • Mongodb设置TTL索引自动清除数据与过期数据的方法

    下面是Mongodb设置TTL索引自动清除数据与过期数据的完整攻略: 什么是TTL索引? TTL(Time-To-Live)即过期时间,是指一条文档在数据库中存储的时限。MongoDB 通过创建 TTL 索引来自动清除过期的文档,TTL 索引是一种在指定时间后自动删除文档的索引类型。它通过在文档中指定一个时间字段,MongoDB会在这个时间字段上创建一个大量…

    人工智能概览 2023年5月25日
    00
  • opencv-python图像处理安装与基本操作方法

    以下是针对”opencv-python图像处理安装与基本操作方法”的完整攻略以及两条示例说明: 安装OpenCV-Python 步骤一:安装Python 在安装OpenCV-Python之前,需要先安装Python环境。推荐安装Python 3.x版本,可以从Python官方网站下载相应的安装程序。安装过程中记得勾选“Add Python 3.x to PA…

    人工智能概览 2023年5月25日
    00
  • Django全局启用登陆验证login_required的方法

    想要在Django项目中全局启用登陆验证 login_required,需要经过以下步骤: 1. 导入 login_required 函数 login_required 函数位于 django.contrib.auth.decorators 模块中,需要先导入此模块。在 Django 的视图函数中使用 login_required 装饰器,可以达到需要登录才…

    人工智能概览 2023年5月25日
    00
  • SpringBoot创建RSocket服务器的全过程记录

    下面是关于Spring Boot创建RSocket服务器的全过程记录。 RSocket简介 RSocket是一种基于Reactive Streams规范并且支持多种传输协议的全双工网络通信协议,可以实现高效、可扩展、快速启动的微服务通信。它由Netty、Reactor和Spring团队合作开发,提供Java、Kotlin和其他语言的客户端和服务器端实现,是S…

    人工智能概览 2023年5月25日
    00
  • 详解docker-compose.yml文件常用模版命令

    下面是关于docker-compose.yml文件常用模板命令的详解攻略。 什么是docker-compose.yml文件? docker-compose.yml文件是Docker Compose工具的核心配置文件,由YAML语言编写。它可以定义一组关联的Docker容器,组合它们为一个应用,并对它们进行管理。 常用模板命令 version 该命令指定doc…

    人工智能概览 2023年5月25日
    00
  • Django contenttypes 框架详解(小结)

    Django contenttypes 框架详解(小结) Django contenttypes 框架是 Django 框架提供的一种解耦的途径,可以实现通用化的外键或者多态关系,本文将介绍该框架的详细使用方法。 什么是 contenttypes contenttypes 是 Django 提供的库,可以在我们的应用中使用通用的外键。通常情况下,使用外键指向…

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