Android多媒体功能开发(13)——使用MediaRecorder类录制视频

用MediaRecorder类实现录像功能的基本步骤是:创建MediaRecorder对象、设置音视频源、设置输出格式和音视频编码格式、设置预览控件和输出文件、准备、开始录制、停止录制、释放资源。停止录制后可以重置,然后开始另一个录制过程。

流程和对应的代码如下图:

注意,所有步骤必须按先后顺序进行,特别是设置各种参数的步骤,不能打乱顺序。

下面编写一个实现最基本的录像功能示的例子,例子针对Android8.0(API26)开发。界面和主要代码如下:

在Activity的onCreate方法中创建MediaRecorder对象,并为其设置预览的SurfaceView组件,再创建视频文件对应的File对象、FileProvider和共享给播放器的URL。当RECORD按钮按下时,执行设置参数和录像的流程。当STOP按钮按下时,执行stop方法。当VIEW按钮按下时,调用视频播放界面来播放录制的视频,以检查录制是否成功。

但是,这样实现的预览功能并不完善,只有开始录像后才有预览显示,录制开始之前没有,且竖屏时也按横屏显示。要在录制开始之前就能预览需要借助Camera类,与拍照预览的实现一样。用了Camera对象之后,还可以选择拍摄用的摄像头,以及旋转90度预览,但视频文件中还是按横屏录制的。录像预览功能也可使用Camera2框架。

将Camera的预览流程和MediaRecorder的录像流程结合到了一起之后的流程和主要代码如下图:

按照上述流程完善后的例子界面和主要代码如下:

MediaRecorder还有一些可选设置,包括摄像头、尺寸和帧速率、最大时长和最大文件长度。这些设置在设置参数步骤中的位置不能更改。并且,设置分辨率和帧速率只能设置系统支持的,否则出错。支持的参数可以通过Camera.getParameters()方法获得。设置这些参数的流程和主要代码如下:

我们为前面的例子加入这些设置,将系统支持的分辨率和帧速率读取出来,让用户选择。这些设置要求API 11以上。加入设置后的界面和主要代码如下:

此外,使用摄像头和录制音频都需要权限,而且在使用之前还需要动态权限检查:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

调用播放视频界面并传递视频文件需要FileProvider,需要在Manifest中声明:

<provider
      android:name="androidx.core.content.FileProvider"
      android:authorities="${applicationId}.fileProvider"
      android:exported="false"
      android:grantUriPermissions="true">
      <meta-data
             android:name="android.support.FILE_PROVIDER_PATHS"
             android:resource="@xml/file_paths" />
</provider>

file_paths.xml定义如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path
        name="testdir"
        path="./"/>
</paths>

例子的完整代码如下:

package com.zzk.a1509videorecord;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanoage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值