当一个-Android-开发玩抖音玩疯了之后,会发生什么?细思极恐

音频的录制我们需要使用到 AudioRecord 这个大杀器,大致流程图如下。

音频录制比较简单,参考官方文档即可。这里需要开启两条线程,因为目前使用的编码是同步模式,如果是在一条线程里处理数据,会导致麦克风的数据丢失。

关键代码如下:

初始化AudioRecord
指定单声道模式,采样率为 44100,每个采样点 16 比特

int bufferSize = AudioRecord.getMinBufferSize(
configuration.getSampleRate(), C.AudioParams.CHANNEL,
C.AudioParams.BITS_PER_SAMPLE);
recorder = new AudioRecord(
MediaRecorder.AudioSource.MIC, configuration.getSampleRate(),
C.AudioParams.CHANNEL, C.AudioParams.BITS_PER_SAMPLE, bufferSize);

复制代码

初始化MediaCodec

MediaFormat audioFormat = MediaFormat.createAudioFormat(C.AudioParams.MIME_TYPE,
C.AudioParams.SAMPLE_RATE, C.AudioParams.CHANNEL_COUNT);
audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE,
MediaCodecInfo.CodecProfileLevel.AACObjectLC);
audioFormat.setInteger(MediaFormat.KEY_CHANNEL_MASK, C.AudioParams.CHANNEL);
audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, C.AudioParams.BIT_RATE);
audioFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, C.AudioParams.CHANNEL_COUNT);
audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1024 * 4);
encoder = MediaCodec.createEncoderByType(C.AudioParams.MIME_TYPE);
encoder.configure(aud
ioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
bufferInfo = new MediaCodec.BufferInfo();
mStream = new BufferedOutputStream(new FileOutputStream(configuration.getFileName()));

复制代码

音频编码

读取音频数据

byte[] buffer = new byte[configuration.getSamplePerFrame()];
int bytes = recorder.read(buffer, 0, buffer.length);
if (bytes > 0) {
encode(buffer, bytes);
}

复制代码

塞进MediaCodec缓冲区

private void onEncode(byte[] data, int length) {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值