Android 多媒体——MediaCodec编码AAC

Android 音频开发——AudioRecord录音
Android 音频开发——AudioTrack播放
Android 多媒体——MediaCodec编码AAC
MeidaCodec 官方地址:https://developer.android.google.cn/reference/android/media/MediaCodec

通过AudioRecord录制的音频数据(pcm格式),占用空间较大,消耗内存和磁盘,更不适合用于网络传输。而AAC是比较通用的压缩格式,这里整理下MeidaCodec编码AAC。

1. MediaCodec

 MediaCodec类用于访问编码器、解码器组件。它是多媒体架构的一部分(通常与MediaExtractorMediaSyncMediaMuxerMediaCryptoMediaDrmImageSurfaceAudioTrackAndroidRecord一起使用)

MediaCodec

简单说,编解码器处理输入数据以生成输出数据。MediaCodec异步处理数据,并使用一组输入和输出缓冲区。

流程:

  1. 请求(或接收)一个空的输入缓冲区;
  2. 将缓冲区填入数据;
  3. 将缓冲区加入队列;
  4. 编解码器处理输入数据,并将数据转换输出缓冲区;
  5. 请求(或接收)一个输出缓冲区;
  6. 获取输出缓冲区的数据;
  7. 释放输出缓冲区;

2. 处理方式

处理方式 API版本<= 20 Jelly Bean / KitKat API版本> = 21 Lollipop及更高版本
使用缓冲区数组的同步API 支持的 不推荐使用
使用缓冲区的同步API 无法使用 支持的
使用缓冲区的异步API 无法使用 支持的

使用缓冲区的异步处理

 首选方法是通过在调用configure之前设置回调来异步处理数据。如下示例:

 MediaCodec codec = MediaCodec.createByCodecName(name);
 MediaFormat mOutputFormat; // member variable
 codec.setCallback(new MediaCodec.Callback() {
   
  @Override
  void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
   
    ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
    // fill inputBuffer with valid data
    …
    codec.queueInputBuffer(inputBufferId,);
  }
 
  @Override
  void onOutputBufferAvailable(MediaCodec mc, int outputBufferId,) {
   
    ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
    MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
    // bufferFormat is equivalent to mOutputFormat
    // outputBuffer is ready to be processed or rendered.
    …
    codec.releaseOutputBuffer(outputBufferId,);
  }
 
  @Override
  void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
   
    // Subsequent data will conform to new format.
    // Can ignore if using getOutputFormat(outputBufferId)
    mOutputFormat = format; // option B
  }
 
  @Override
  void onError() {
   }
 });
 codec.configure(format,);
 mOutputFormat = codec.getOutputFormat(); // option B
 codec.start();
 // wait for processing to complete
 codec.stop();
 codec.release();

使用缓冲区的同步处理

MediaCodec通常在同步模式下按以下方式使用

 MediaCodec codec = MediaCodec.createByCodecName</
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值