使用 AudioRecord 录制 PCM、WAV 文件,AudioTrack 播放 PCM 文件

概述

AudioRecord、AudioTrack 的使用都比较简单,基本流程:

AudioRecord:
1) AudioRecord.getMinBufferSize()
2) new AudioRecord()
3) mAudioRecord.read()

如此,即可得到录制好的音频裸数据(PCM)。

AudioTrack 有两种播放方式:
1) static:把音频数据一次性写入 AudioTrack,再进行播放
2) stream:边写边播

播放流程基本都是:
1) AudioTrack.getMinBufferSize()
2) new AudioTrack()
3) mAudioTrack.write() // static 方式必须先 write,再 play
4) mAudioTrack.play()

其中 getMinBufferSize()、new AudioRecord()、new AudioTrack() 需要传入 sampleRate、channel、sampleFormat 等参数,这些参数涉及到音频开发的一些基础知识,可参考我的另一篇博客:音视频开发基础概述 - PCM、YUV、H264、常用软件介绍

AudioRecord 录制 PCM 数据

public class AudioRecorder {
   

    private static final String TAG = "AudioRecorder";

    private static final int DEFAULT_SAMPLE_RATE = 48000;
    private static final int DEFAULT_PCM_DATA_FORMAT = AudioFormat.ENCODING_PCM_16BIT;

    private ExecutorService mExecutor = Executors.newCachedThreadPool();
    private AudioRecord mAudioRecord;
    private int mBufferSize;
    private int mSampleRate = DEFAULT_SAMPLE_RATE;
    private int mPcmFormat = DEFAULT_PCM_DATA_FORMAT;

    private AudioRecordCallback mRecordCallback;
    private Handler mHandler;
    private boolean mIsRecording = false;

    public void setSampleRate(int sampleRate) {
        mSampleRate = sampleRate;
    }

    public void setPcmFormat(int pcmFormat) {
        mPcmFormat = pcmFormat;
    }

    public void setRecordCallback(AudioRecordCallback recordCallback) {
        mRecordCallback = recordCallback;
    }

    public int getChannels() {
        return 1;
    }

    public boolean start() {
        try {
            mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, AudioFormat.CHANNEL_IN_MONO,
                    mPcmFormat);
            mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRate,
                    AudioFormat.CHANNEL_IN_MONO, mPcmFormat, mBufferSize);
        } catch (Exception e) {
            Log.e(TAG, "init AudioRecord exception: " + e.getLocalizedMessage());
            return false;
        }

        if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
            Log.e(TAG, "cannot init AudioRecord&
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值