android音视频指南-MediaRecorder概述

3,170 阅读3分钟

翻译自MediaRecorder overview

Android多媒体框架支持捕获和编码各种常见的音频和视频格式。如果设备硬件支持,您可以使用MediaRecorder api。

本文档向您展示了如何使用MediaRecorder编写一个应用程序,该应用程序从设备麦克风捕获音频,保存音频并回放(使用MediaPlayer)。要录制视频,你需要使用设备的摄像头和MediaRecorder。这是在Camera指南中描述的。

注意:Android模拟器无法录制音频。一定要在可以录制的真实设备上测试代码。

请求允许录制音频

为了能够录制,你的应用程序必须告诉用户它将访问设备的音频输入。你必须在应用程序的清单文件中包含这个权限标签:

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

RECORD_AUDIO被认为是一个“危险的”权限,因为它可能会对用户的隐私构成威胁。从Android 6.0 (API level 23)开始,使用危险权限的应用程序必须在运行时请求用户批准。用户获得许可后,应用程序应记住并不再询问。使用ActivityCompat.requestPermissions()实现此行为。

创建和运行一个MediaRecorder

用以下调用初始化MediaRecorder的新实例:

  • 使用setAudioSource()设置音频源。你可能会用麦克风。

注意:大多数音频源(包括DEFAULT)会对音频信号进行处理。要录制原始音频选择UNPROCESSED。有些设备不支持未处理的输入。首先调用AudioManager.getProperty(AudioManager.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)以验证其可用性。如果不是,尝试使用VOICE_RECOGNITION替代,它不使用AGC或噪声抑制。即使不支持属性,也可以将未处理的信号用作音频源,但在这种情况下,无法保证信号是否会被未处理。

  • 使用setOutputFormat()设置输出文件格式。注意,从Android 8.0 (API级别26)开始MediaRecorder支持MPEG2_TS格式,这对于流媒体很有用:
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
  • 使用setOutputFile()设置输出文件名。必须指定表示实际文件的文件描述符。
  • 使用setAudioEncoder()设置音频编码器。
  • 通过调用prepare()来完成初始化。

分别调用Start()和stop()来启动和停止记录器。

用完MediaRecorder实例后,通过调用release()尽快释放其资源。

注意:在运行Android 9 (API level 28)或更高的设备上,后台运行的应用程序无法访问麦克风。因此,您的应用程序应该只在前台或前台服务中包含MediaRecorder实例时录制音频。

使用MediaMuxer录制多个通道

从Android 8.0 (API级别26)开始,您可以使用MediaMuxer录制多个同步音频和视频流。在早期的Android版本中,你一次只能录制一个音轨和/或一个视频轨。

使用addTrack()方法将多轨道混合在一起。

您还可以为每个frame添加一个或多个metadata跟踪,并提供定制信息,但仅限于MP4容器。您的应用程序定义元数据的格式和内容。

添加metadata

metadata可以用于离线处理。例如,从陀螺传感器捕获的数据可以用来稳定视频。

当添加metadata跟踪时,跟踪的mime格式必须以前缀‘application/’开始。编写metadata与编写视频或音频数据是一样的,只是数据不是来自MediaCodec。相反,应用程序将带有相关时间戳的ByteBuffer传递给writeSampleData()方法。时间戳必须与视频和音频轨道在同一时间基础上。

生成的MP4文件使用ISO BMFF规范12.3.3.2节中定义的TextMetaDataSampleEntry作为metadata的mime格式的信号。当您使用MediaExtractor提取包含metadata跟踪的文件时,metadata的mime格式将作为MediaFormat的实例出现。

示例代码

Android MediaRecorder示例演示了如何使用MediaRecorder和Camera API进行视频录制。