MediaCodec AudioRecord 硬编 AAC 格式音频(一)

本文详细介绍了使用Android的MediaCodec进行AAC音频硬编码的过程,包括AudioRecord录制PCM音频和MediaCodec编码成AAC格式的步骤,同时提供了相关参考资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上有很多关于 MediaCodec 硬编解 AAC 格式音频的文章,但良莠不齐,以下时自己学习 MediaCodec 硬编 AAC 格式音频过程的记录和一些参考的文章。

介绍

AAC
一种音频压缩格式,区别于无损的 PCM 数据格式,其中分成了两种:ADTS 和 ADIF 格式

  • ADTS:Audio Data Interchange Format 音频数据交换格式,有一个统一的头部再带上数据流,如果想解析,必须得到所有的数据后,先寻找同步头,再解码。
  • ADIF:Audio Data Transport Stream 音频数据传输流,每一个帧都有一个头部,所以可以在任意帧上进行解码。

AudioRecord
Android 中录制无损音频 PCM 格式的工具
关于 AudioRecord 录音的流程和参数可以参考之前的文章 Android AudioRecord、AudioTrack 录制播放音频

MediaCodec
MediaCodec 是 Android 用于音视频编解码的一套偏底层的 API,直接利用硬件加速进行编解码。

我们所需要做的处理流程:

  1. dequeueInputBuffer:从 input 缓存区申请 buffer 编号 Index
  2. getInputBuffer:用编号 Index 取得输入的缓冲区,将需要编码的数据写入 buffer
  3. queueInputBuffer:将 buffer 入 MediaCodec 的队列,MediaCodec 会从 buffer 中取数据处理
  4. dequeueOutputBuffer:从 output 缓冲区申请 buffer 编号
  5. getOutputBuffer:用编号 Index 取得输出的缓冲区,buffer 中就是处理后的数据
  6. releaseOutputBuffer:将该 buffer 放回 output 缓冲区队列

示意图

流程

1. AudioRecord 录制 PCM 格式的音频

(1)创建 AudioRecord:

// 算出所需的最小的缓冲区大小
int minBufferSize = AudioRecord.getMinBufferSize(
    44100, // 采样率
    AudioFormat.CHANNEL_IN_MONO, // 通道数
    AudioFormat.ENCODING_PCM_16BIT
    );

mRecorder = new AudioRecord(
    MediaRecorder.AudioSource.DEFAULT, // 音频源
    44100, // 采样率
    AudioFormat.CHANNEL_IN_MONO, // 声道
    AudioFormat.ENCODING_PCM_16BIT, // 采样大小
    minBufferSize 
    );

(2)开始录音

mRecorder.startRecording();

(3)读取 mRecorder 的一帧帧数据,实时传送给 MediaCodec 后续处理

while (isRecording && (len = mRecorder.read(bytesBuffer, 0, minBufferSize)) > 0) {
    // 后续转码处理
}
2. 通过 MediaCodec 硬编成 AAC 格式,并保存为外部文件

(1)MediaCodec 创建流程

mEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC); 
//指定创建的MediaCodec类型

MediaFormat format = MediaFormat.createAudioFormat(
    MediaFormat.MIMETYPE_AUDIO_AAC,
    44100, //采样率
    1 // 声道数量,一开始写成了AudioFormat.CHANNEL_IN_MONO
);
format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AAC);
// 封装可用于编解码器组件的配置文件
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); 
//码率:声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标
format.setInteger(MediaFormat.KEY_BIT_RATE, 96000);//传入的数据最大值,可以修改
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, minBufferSize * 2);
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mEncoder.start();

(2)MediaCodec 具体转码流程

while (isRecording && (len = mRecorder.read(bytesBu
参考链接http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html 在链接内容基础上修改了amr格式aac格式 Android提供了两个API用于实现录音功能:android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下: 1、AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据码以及压缩 示例: 使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码) 2、MediaRecorder 已经集成了录音、码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件 示例: 使用MediaRecorder类录音,输出amr格式文件。录音20s,输出的音频文件大概为33K(已写测试代码) 3、音频格式比较 WAV格式:录音质量高,但是压缩率小,文件大 AAC格式:相对于mp3,AAC格式的音质更佳,文件更小;有损压缩;般苹果或者Android SDK4.1.2(API 16)及以上版本支持播放 AMR格式:压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话录音 至于常用的mp3格式,使用MediaRecorder没有该视频格式输出。些人的做法是使用AudioRecord录音,然后码成wav格式,再转换成mp3格式 再贴上些测试工程。 功能描述: 1、点击“录音WAV文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.wav 2、点击“录音AMR文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.amr 3、点击“停止录音”,停止录音,并显示录音输出文件以及该文件大小。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值