完整代码:https://github.com/wuqingsen/AVWuDemo
目录:Android音视频整理
步骤:
1. 设置缓冲区大小
2. 初始化 AudioRecord
3. 初始化 AAC 编码器,初始化 MediaCodec
4. 开始录制,编码 PCM 数据 得到 AAC 格式的音频文件
1. 设置缓冲区大小
/**
* 1.设置缓冲区大小
* 参数:采样率 16k; 通道数 单通道; 采样位数
*/
int bufferSize = AudioRecord.getMinBufferSize(16000,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT * 1);
2. 初始化 AudioRecord
/**
* 2.初始化AudioRecord
* 参数:录音来源 麦克风; 采样率 16k; 通道数 单通道 ;采样位数/数据格式 pcm; 缓冲区大小
*/
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 16000,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
3. 初始化 AAC 编码器,初始化 MediaCodec
/**
* 初始化AAC编码器
*/
private void initAACMediaEncode() {
try {
//参数对应-> mime type、采样率、声道数
MediaFormat encodeFormat = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 16000, 1);
encodeFormat.setInteger(MediaFormat.KEY_BIT_RATE, 64000);//比特率
encodeFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
encodeFormat.setInteger(MediaFormat.KEY_CHANNEL_MASK, AudioFormat.CHANNEL_IN_MONO);
encodeFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
encodeFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, samples_per_frame);//作用于inputBuffer的大小
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
mediaCodec.configure(encodeFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
} catch (IOException e) {
e.printStackTrace();
}
if (mediaCodec == null) {
Log.e("wqs", "create mediaEncode failed");
return;
}
mediaCodec.start();
encodeInputBuffers = mediaCodec.getInputBuffers();
encodeOutputBuffers = mediaCodec.getOutputBuffers();
encodeBufferInfo = new MediaCodec.BufferInfo();
}
4. 开始录制,编码 PCM 数据 得到 AAC 格式的音频文件
/**
* 编码PCM数据 得到AAC格式的音频文件
*/
private void dstAudioFormatFromPCM(byte[] pcmData) {
int inputIndex;
ByteBuffer inputBuffer;
int outputIndex;
ByteBuffer outputBuffer;
int outBitSize;
int outPacketSize;
byte[] PCMAudio;
PCMAudio = pcmData;
encodeInput