前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >音视频基础能力之 Andoid 音频篇(二):音频录制

音视频基础能力之 Andoid 音频篇(二):音频录制

原创
作者头像
声知视界
修改2024-11-19 10:14:24
修改2024-11-19 10:14:24
1750
举报
文章被收录于专栏:音频音频

一、概述

MediaRecorder 是 Android 平台 android.media.* 目录下对外提供的高级 API,它内部封装了采集、编码、封装的逻辑操作,最终生成的文件格式是多媒体容器格式,例如 mp4, ogg 等文件格式。如果您对录制格式不是很清楚的话,可以点击看下这篇文章:一文搞清多媒体格式(建议收藏)

MediaRecorder 通常是音频、视频搭配一起使用,也可以单独使用。由于我们这篇主要来讲述音频采集相关的内容,我们将着重讲解音频相关的部分,最终提供的 samplecode 生成的文件格式也仅只有音频轨。

MediaRecorder 的使用场景通常是本地录制,如果您没有对音频、视频流有额外的处理操作,使用这个 API 无疑是最佳的解决方案。

上图是官方提供的 MediaRecorder 运行状态图。我们只要理解了 MediaRecorder 的运行机制,便能很好的使用它。下面详细的讲讲 MediaRecorder 的 API 调用过程中,MediaRecorder的状态切换以及完成了哪些工作。

二、工作流

下面贴出一段 MediaRecorder 初始化的代码,虽然很简洁,但是一点都不简单。执行这些代码的过程中,MediaRecorder 帮助我们完成了很多繁重的工作。

代码语言:kotlin
复制
//初始化配置
recorder = MediaRecorder().apply {
    setAudioSource(MediaRecorder.AudioSource.MIC)
    setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
    setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
    setOutputFile(fileName)
}

//监听错误回调
recorder?.setOnErrorListener { mr, what, extra ->
    when (what) {
        MediaRecorder.MEDIA_ERROR_SERVER_DIED -> {
            Log.i(this.tag, "远程服务错误,MediaRecorder无法继续工作,需要重新初始化, extra:$extra")
            mr.reset()
        }
        MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN -> {
            Log.i(this.tag, "MediaRecorder 内部出现未知错误, extra:$extra")
            mr.reset()
        }
    }
}

//准备
recorder?.prepare()

//开始
recorder?.start()

//停止
recorder?.stop()

//结束
recorder?.reset()
recorder?.release()

2.1 初始化(Initialized)

设置 setAudioSource 音频源,主要目的是告诉系统,你的使用场景是什么?这将决定于系统采用什么样的音频采集设备,采样什么的音频配置以及内部逻辑策略,这个后续准备单独一篇文章来聊聊。上文也提及到通常使用 MediaRecorder 是为了本地录制用的,所以我们这里选择MIC。

执行完这行代码,MediaRecorder 对象将进入 Initialized 状态。

2.2 数据源配置

这步主要配置音视频的编码器、容器封装格式、文件输出路径。我们这里选择了使用音频的 aac 编码,mp4 的封装格式。执行完这几步代码,MediaRecorder 会帮我们创建和配置编码器、封装器等工作。

2.3 就绪(Prepared)

这个步骤执行完成之后,MediaRecorder内部会进入就绪状态。内部的线程也开始运转,等待原始的音频帧推送过来,然后进行编码和封装的操作。

2.4 开始录制

这个步骤执行完成之后,MediaRecorder 内部会进入 Recording 状态,字如其名,MediaRecorder 开启启动了采集,内部的录制管线(音频采集 → 编码 → 封装 → 写文件)开始正真的流转了起来。

2.5 结束录制

停止录制,如果想让状态机回到初始状态(Initial),需要调用下 reset() 函数。

2.6 释放资源

释放 MediaRecorder 内部所有持有的资源,包括采集、编码器、封装器、线程等。此步执行完成之后,状态机将失效。

三、最后

本文详细的讲解了 MediaRecorder 的运行机制和使用上需要的事项。MediaRecorder 是属于 Android 平台比较偏上层的 API 接口,它偏向本地录制的通用场景,简单的 API 调用完成了相对比较复杂的工作。但是如果您对原始音频流有一些特殊的操作,此接口就不太适合,只能使用 AudioRecorder 去拿到原始的音频帧数据。

下面是 github 上的示例代码链接:

https://github.com/Sound-Vision/audio_record/tree/main/android

另外,如果您觉得以上内容对您有所帮助的话,可以关注我们运营的公众号 “声知视界”,会定期推送音视频技术、移动端技术为主轴的 科普类、技术知识类、行业资讯类等相关文章。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、工作流
    • 2.1 初始化(Initialized)
    • 2.2 数据源配置
    • 2.3 就绪(Prepared)
    • 2.4 开始录制
    • 2.5 结束录制
    • 2.6 释放资源
  • 三、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档