android中录音断点播放,Android实现暂停--继续录音(AudioRecord)

Android提供了两个API用于录音的实现:MediaRecorder 和 AudioRecord,各有优劣。

1、MediaRecorder

已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp

优点:大部分已经集成,直接调用相关接口即可,代码量小

缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件

2、AudioRecord

主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音)

优点:语音的实时处理,可以用代码实现各种音频的封装

缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩

这次我们说说 AudioRecord,由于MediaRecorder 不能实现暂停和继续,在网上看了N多博客等资料,使用了AudioRecord来实现。

大部分代码来自 参考资料:http://blog.csdn.net/imhxl/article/details/52190451

小demo:

AudioRecorder:封装了录音的方法:创建录音对象、开始、暂停、停止、取消,使用静态枚举类Status来记录录音的状态。

FileUtils:文件工具类,用于文件路径的获取

PcmToWav:封装了将.pcm文件转化.wav文件的方法

WaveHeader: wav文件头

RecordStreamListener:监听录音音频流,用于拓展业务的处理

①用于管理录音的工具类

import android.content.Context;

import android.media.AudioFormat;

import android.media.AudioRecord;

import android.media.MediaRecorder;

import android.text.TextUtils;

import android.text.format.DateFormat;

import android.util.Log;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import java.util.Locale;

/**

* Created by HXL on 16/8/11.

* 用于实现录音 暂停录音

*/

public class AudioRecorder {

private static AudioRecorder audioRecorder;

//音频输入-麦克风

private final static int AUDIO_INPUT = MediaRecorder.AudioSource.MIC;

//采用频率

//44100是目前的标准,但是某些设备仍然支持22050,16000,11025

//采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级

private final static int AUDIO_SAMPLE_RATE = 16000;

//声道 单声道

private final static int AUDIO_CHANNEL = AudioFormat.CHANNEL_IN_MONO;

//编码

private final static int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

// 缓冲区字节大小

private int bufferSizeInBytes = 0;

//录音对象

private AudioRecord audioRecord;

//录音状态

private Status status = Status.STATUS_NO_READY;

//文件名

private String fileName;

//录音文件

private List filesName = new ArrayList<>();

private AudioRecorder() {

}

//单例模式

public static AudioRecorder getInstance() {

if (audioRecorder == null) {

audioRecorder = new AudioRecorder();

}

return audioRecorder;

}

/**

* 创建录音对象

*/

public void createAudio(String fileName, int audioSource, int sampleRateInHz, int channelConfig, int audioFormat) {

// 获得缓冲区字节大小

bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,

channelConfig, audioFormat);

audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

this.fileName = fileName;

}

/**

* 创建默认的录音对象

* @param fileName 文件名

*/

public void createDefaultAudio(String fileName) {

mContext = ctx;

mHandler = handler;

// 获得缓冲区字节大小

bufferSizeInBytes = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE,

AUDIO_CHANNEL, AUDIO_ENCODING);

audioRecord = new AudioRecord(AUDIO_INPUT, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL, AUDIO_ENCODING, bufferSizeInBytes);

this.fileName = fileName;

status = Status.STATUS_READY;

}

/**

* 开始录音

* @param listener 音频流的监听

*/

public void startRecord(final RecordStreamListener listener) {

if (status == Status.STATUS_NO_READY || TextUtils.isEmpty(fileName)) {

throw new IllegalStateException("录音尚未初始化,请检查是否禁止了录音权限~");

}

if (status == Status.STATUS_START) {

throw new IllegalStateException("正在录音");

}

Log.d("AudioRecorder","===startRecord==="+audioRecord.getState());

audioRecord.startRecording();

new Thread(new Runnable() {

@Override

public void run() {

writeDataTOFile(listener);

}

}).start();

}

/**

* 暂停录音

*/

public void pauseRecord() {

Log.d("AudioRecorder","===pauseRecord===");

if (status != Status.STATUS_START) {

throw new IllegalStateException("没有在录音");

} else {

audioRecord.stop();

status = Status.STATUS_PAUSE;

}

}

/**

* 停止录音

*/

public void stopRecord() {

Log.d("AudioRecorder

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值