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日

相关文章

  • Django中模版的子目录与include标签的使用方法

    当我们的Django项目中包含大量的模版文件时,为了更方便地组织和管理,我们可以使用模版的子目录。同时,Django中的include标签也提供了一种方便的方式来引入模版,可以在模版中多次引用一个模版文件,从而减少代码的重复。 以下是关于在Django中使用模版的子目录和include标签的详细步骤: 1. 配置settings.py Django默认情况下…

    人工智能概览 2023年5月25日
    00
  • python中时间转换datetime和pd.to_datetime详析

    Python中时间转换:datetime和pd.to_datetime详析 在Python中,时间的处理是一个常见需求。为了方便处理时间类型变量,Python提供了datetime库来进行时间转换。此外,pandas库也提供了pd.to_datetime函数来进行时间变量的转换。本文将详细介绍datetime和pd.to_datetime的使用方法和区别。 …

    人工智能概论 2023年5月25日
    00
  • django主动抛出403异常的方法详解

    Django主动抛出403异常的方法详解 在有些情况下,Django开发者需要手动触发403异常,以便在特定情形下让用户无法继续访问某些页面或资源。本文将详细讲解Django主动抛出403异常的方法。 在视图函数中主动抛出403异常 在Django的视图函数中,可以使用raise PermissionDenied语句来主动抛出403异常,示例如下: from…

    人工智能概论 2023年5月25日
    00
  • pytorch transform数据处理转c++问题

    要将pytorch中对数据进行Transform处理的操作转化到C++中,可以参考以下步骤: 步骤一:准备数据集 首先要准备好需要处理的数据集,可以使用一些流行的开源数据集,例如CIFAR-10等。数据集可以使用PyTorch的Dataset来加载。 步骤二:定义Transform 在PyTorch中,可以使用torchvision.transforms来定…

    人工智能概论 2023年5月25日
    00
  • Docker AIGC等大模型深度学习环境搭建步骤最新详细版

    Docker AIGC大模型深度学习环境搭建步骤 简介 Docker是一款虚拟化容器技术,它可以将应用及其依赖打包为一个可移植的容器,从而实现软件环境的一致性和跨平台性。在深度学习领域,Docker不仅可以简化环境搭建的复杂度,也可以减少环境带来的差异性。 AIGC (AI Grand Challenge)是面向深度学习领域的AI竞赛平台,通过在平台上提供大…

    人工智能概览 2023年5月25日
    00
  • PERL脚本 学习笔记

    PERL脚本 学习笔记攻略 第一步:了解PERL语言和脚本的基础知识 首先,我们需要了解PERL语言和脚本的基础知识。PERL是一种解释性的脚本语言,常用于文本处理、系统管理和网络编程等领域。 如果你还没有接触过PERL,可以先浏览一下官方文档 http://www.perl.org,了解一下语言的基本语法、数据类型、运算符和控制结构等内容。 第二步:选择一…

    人工智能概论 2023年5月25日
    00
  • struts json 类型异常返回到js弹框问题解决办法

    Struts JSON 类型异常返回到 JS 弹框问题解决办法 问题描述 在使用 Struts 框架时,当后台向前端返回 JSON 类型的数据时,如果发生异常,如何将异常信息以弹框形式提示给用户? 解决办法 Struts 2 支持全局异常拦截器,我们可以在 struts.xml 文件中配置全局异常拦截器,并在异常拦截器中实现将异常信息转换成 JSON 类型,…

    人工智能概论 2023年5月25日
    00
  • Linux面试中最常问的10个问题总结

    以下是关于“Linux面试中最常问的10个问题总结”的完整攻略: 1. 什么是Linux操作系统? Linux是一种免费开源操作系统,是由Linus Torvalds及其团队创建和维护的。它是基于Unix操作系统开发的,并且具有良好的可扩展性和稳定性,因此被广泛应用于服务器系统、移动设备操作系统等领域。 2. Linux下的文件系统目录结构是什么样子的? 在…

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