releaseRecord();//释放可能没释放的录音相关资源
if (!doStartRecord()) {//真正的开始录音的函数,开始录音成功返回true,否则返回false
recordFail(); //开始失败,向用户提示开始录音失败
}
if (mMediaRecorder != null) {
mMediaRecorder.release();
mMediaRecorder = null;
}
private boolean doStartRecord() {
try {
mMediaRecorder = new MediaRecorder();
mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/voice/"
+ System.currentTimeMillis() + ".m4a");
mAudioFile.getParentFile().mkdirs();
mAudioFile.createNewFile();
//设置从麦克风采集声音
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//保存文件为mp4的格式
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置所有android系统都支持的采样频率
mMediaRecorder.setAudioSamplingRate(44100);
//设置acc的编码方式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置比较好的音质
mMediaRecorder.setAudioEncodingBitRate(96000);
mMediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());
mMediaRecorder.prepare();
mMediaRecorder.start();
mStartRecordTime = System.currentTimeMillis();
} catch (IOException | RuntimeException e) {
e.printStackTrace();
return false;
}finally {
if(mAudioRecord != null){
mAudioRecord.release();
}
}
return true;
}
mAudioFile = null;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(VioceActivity.this, "录音失败", Toast.LENGTH_SHORT).show();
}
}, 100);
if (!doStopRecord()) {//实现 停止录音的真正逻辑,成功返回true,否则返回false
recordFail();//提示用户录音失败
}
mMediaRecorder.stop();
mEndRecordTime = System.currentTimeMillis();
final int seond = (int) ((mEndRecordTime - mStartRecordTime) / 1000);
if (seond < 3) {
recordFail();
return false;
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
mText.setText("录音" + seond + "成功!");
}
});
}
} catch (RuntimeException e) {
e.printStackTrace();
return false;
}
return true;
private void doPlay(File mAudioFile) {
//配置播放器 MediaPlayer
mMediaPlayer = new MediaPlayer();
try{
//设置声音文件
mMediaPlayer.setDataSource(mAudioFile.getAbsolutePath());
//设置监听回调
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlay();
}
});
//设置出错的监听器
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
playFail();
//提示用户
stopPlay();
//释放播放器
return true;
}
});
//配置音量,是否循环
mMediaPlayer.setVolume(1,1);
mMediaPlayer.setLooping(false);
mMediaPlayer.prepare();
mMediaPlayer.start();
}catch (Exception e){
e.printStackTrace();
playFail();
stopPlay();
}
}
private boolean startRecord2() {
try {
mAudioFile2 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/voice/"
+ System.currentTimeMillis() + ".pcm");
mAudioFile2.getParentFile().mkdirs();
mAudioFile2.createNewFile();
mFileOutputStream = new FileOutputStream(mAudioFile2);
//配置AudioRecord
//从麦克风采集数据
int audioSource = MediaRecorder.AudioSource.MIC;
//采集频率
int sampleRate = 44100;
//单声道输入
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
//设置pcm(脉冲编码调制 Pulse Code Modulation)编码格式
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
//计算AudioRecord 内存buffer最小的大小
int minBufferSize = AudioRecord.getMinBufferSize(sampleRate,channelConfig,audioFormat);
//创建AudioRecord对象
mAudioRecord = new AudioRecord(audioSource,sampleRate,channelConfig,audioFormat,Math.max(BUFFER_SIZE,minBufferSize));
mAudioRecord.startRecording();
mStartRecordTime = System.currentTimeMillis();
//循环读取数据,写到输出流中
while(mIsRecord){
int read = mAudioRecord.read(mBuffer,0,BUFFER_SIZE);
if(read >0 ){
//读取文件写到文件中
mFileOutputStream.write(mBuffer,0,read);
}else{
return false;
}
}
} catch (IOException | RuntimeException e) {
e.printStackTrace();
return false;
}
//停止录音
return true;
}
private boolean doStopRecord() {
try {
mMediaRecorder.stop();
mEndRecordTime = System.currentTimeMillis();
final int seond = (int) ((mEndRecordTime - mStartRecordTime) / 1000);
if (seond < 3) {
recordFail();
return false;
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
mText.setText("录音" + seond + "成功!");
}
});
}
} catch (RuntimeException e) {
e.printStackTrace();
return false;
}
return true;
}
private boolean mIsRecord = false; private final int BUFFER_SIZE = 2048;//缓存区的大小 private byte[] mBuffer; private FileOutputStream mFileOutputStream; private AudioRecord mAudioRecord; private File mAudioFile2;
private void doPlay2(File mAudioFile) {
//声音类型,扬声器播放
int steamType = AudioManager.STREAM_MUSIC;
//采样频率
int sampleRate = 44100;
//MONO 表示单声道 录音输入单声道 播放也使用单声道
int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
//录音使用16bit 所以播放也使用同样的格式
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
//流模式
int mode = AudioTrack.MODE_STREAM;
//计算需要最小buffer的大小
int minBufferSize =AudioTrack.getMinBufferSize(sampleRate,channelConfig,audioFormat);
AudioTrack audioTrack = new AudioTrack(steamType,sampleRate,channelConfig,audioFormat,
Math.max(minBufferSize,BUFFER_SIZE),mode);
//从文件流中读取数据
FileInputStream inputStream = null;
try{
inputStream = new FileInputStream(mAudioFile2);
int read;
//循环读取数据,写到播放器去播放
audioTrack.play();
while((read = inputStream.read(mBuffer)) > 0){
int ret = audioTrack.write(mBuffer,0,read);
switch (ret){
case AudioTrack.ERROR:
case AudioTrack.ERROR_BAD_VALUE:
case AudioTrack.ERROR_INVALID_OPERATION:
case AudioTrack.ERROR_DEAD_OBJECT:
playFail();
return ;
default:
break;
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
mIsPlaying = false;
if(inputStream != null)
closeQuietly(inputStream);
resetQuietly(audioTrack);
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有