AAC 音频编码保存和解码播放

本文介绍了Android中使用MediaCodec进行AAC音频编码,MediaExtractor进行媒体数据提取,以及如何编码保存和解码播放的过程。在编码保存时需要注意为每一帧添加ADTS头。
摘要由CSDN通过智能技术生成
一. 编码器 MediaCodec

MediaCodec 是 Android 提供的用于对音频进行编解码的类,属于硬编解。MediaCodec 在编解码的过程中使用了一组缓冲区来处理数据。如下图所示:
image.png
基本使用流程如下:

// 1 创建编解码器
MediaCodec.createByCodecName() // createEncoderByType , createDecoderByType

// 2 配置编解码器
configure(@Nullable MediaFormat format, @Nullable Surface surface, @Nullable MediaCrypto crypto, int flags)

// 3 开始编解码
start

// 4 循环处理数据
while(true) {
    dequeueInputBuffer// 获取可用的输入缓存区 buffer 的下标 inputIndex
    getInputBuffers// 根据 inputIndex 获取可用的输入缓冲区 bytebuffer 
    bytebuffer.put // 放入数据
    queueInputBuffer // 将数据放入输入缓冲区

    dequeueOutputBuffer // 获取可用的输出缓存区 buffer 的下标 outputIndex
    getOutPutBuffers // 根据 outputIndex 获取可用的输出缓冲区 bytebuffer
    outputBuffer.get() // 获取数据

    releaseOutputBuffer // 处理完成,释放 buffer
}

// 5 终止
stop 

// 6 释放编码器使用的资源
release
二. MediaExtractor 媒体数据提取器

通过 MediaExtractor 可以将媒体文件的视频和音频数据分离,也可以获取对应的音频格式或者视频格式。主要 API 如下:

  • setDataSource : 设置数据源
  • getTrackCount:获取文件的通道数,音频通道和视频通道
  • getTrackFormat : 获取指定通道的格式,比如音频的格式或者是视频的格式
  • getSampleTime: 获取当前帧的时间戳
  • readSampleData :将当前帧数据写入 byteBuffer
  • advance : 读取下一帧
  • release : 释放资源

基本使用流程如下:

// 1 设置数据源
setDataSource

// 2 获取对应的视频或者音频格式
getTrackFormat

// 3 定位到某条轨道
selectTrack 

// 4 读取数据
while(true) {
    readSampleData 
    advance
}

// 5 释放
release
三. 编码保存

特别指出,由于 aac 的格式问题,如果保存到本地需要对每一帧添加 ADTS ,见 addADTStoPacket 方法

public class AacAudioRecord {
    private static final String TAG = "AacAudioRecord";
    private AudioRecord mAudioRecord;
    private MediaCodec mAudioEncoder;

    private volatile boolean mIsRecording = false;
    private ExecutorService mExecutorService;

    private int mAudioSource;
    private int mSampleRateInHz;
    private int mChannelConfig;
    private int mAudioFormat;
    private int mBufferSizeInBytes;
    private MediaFormat mMediaFormat;
    private String mFilePath;
    private File mFile;
    private FileOutputStream mFileOutputStream;
    private BufferedOutputStream mBufferedOutputStream;

    private BlockingQueue<byte[]> mDataQueue;


    public AacAudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes) {
        mAudioSource = audioSource;
        mSampleRateInHz = sampleRateInHz;
        mChannelConfig = channelConfig
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值