博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔记18 | MediaRecorder录音
阅读量:5020 次
发布时间:2019-06-12

本文共 3904 字,大约阅读时间需要 13 分钟。

前言

MediaRecorder可以实现录音和录像,使用MediaRecorder录音录像时需要严格遵守API说明中的函数调用先后顺序,否则不能成功执行。

地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/50681230官方说明:http://developer.android.com/reference/android/media/MediaRecorder.html

MediaRecorder类的常用方法

  • MediaRecorder() 构造方法

  • getMaxAmplitude() 得到目前为止最大的幅度

  • prepare() 准备录音机

  • release() 释放MediaRecorder对象

  • reset() 重置MediaRecorder对象,使其为空闲状态

  • setAudioEncoder() 设置音频编码

  • setAudioSource() 设置音频源

  • setCamera() 设置摄像机

  • setMaxDuration() 设置最大期限

  • setMaxFileSize() 设置文件的最大尺寸

  • setOnErrorListener() 错误监听

  • setOutputFile() 设置输出文件

  • setOutputFormat() 设置输出文件的格式

  • setPreviewDisplay() 设置预览

  • setVideoEncoder() 设置视频编码

  • setVideoFrameRate() 设置视频帧的频率

  • setVideoSize() 设置视频的宽度和高度(分辨率)

  • setVideoSource() 设置视频源

  • start() 开始录制

  • stop() 停止录制

效果

20171016拓展录制时间:

主要代码

Mainactivity:

package com.example.book_mediarecorder;import java.io.File;import java.sql.Date;import java.text.SimpleDateFormat;import android.app.Activity;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {	Boolean isRecording=false;	TextView rTimer;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		final Button button = (Button) findViewById(R.id.bRecourd);		rTimer = (TextView) findViewById(R.id.rTimer);		if (isRecording) {			button.setText("正在录制中...");		}else{			button.setText("开始录制");		}		button.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				if (!isRecording) {					isRecording=true;					button.setText("正在录制中...");					startRecord();				}else{					isRecording=false;					button.setText("开始录制");					stopRecord();				}			}		});	}	private MediaRecorder mr=null; 	int Count;	//开始录制	private void startRecord() {		if (mr == null) {			File dir = new File(Environment.getExternalStorageDirectory(), "sounds"); //创建音频存放的目录			if (!dir.exists()) {				dir.mkdirs();			}			File soundFile = new File(dir, getCurrentTime()+".amr"); //创建的音频名称			if (!soundFile.exists()) {				try {					soundFile.createNewFile();				} catch (Exception e) {					e.printStackTrace();				}			}			mr = new MediaRecorder();			mr.setAudioSource(MediaRecorder.AudioSource.MIC);//拿到机器的MIC			mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);//设置输出格式			mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//设置编码格式			mr.setOutputFile(soundFile.getAbsolutePath());			try {				mr.prepare();				mr.start();			} catch (Exception e) {				e.printStackTrace();			}			Count = 0;			handler = new Handler();			runnable = new Runnable() {				@Override				public void run() {					if (Count == 1800) {//限制录制时间1800s						mr.stop();						mr.release();						mr = null;					}					Count ++;					str = showTimeCount((long)Count)+"/30:00";					rTimer.setText(str);					if (handler!=null) {						handler.postDelayed(this, 1000);					}				}			};			runnable.run();		}	}	Handler handler;	Runnable runnable ;	String str;	//停止录制	private void stopRecord() {		if (mr != null) {			mr.stop();			mr.release();			mr = null;		}		str="";		handler=null;		runnable=null;	}	//获取当前时间,以其为名来保存录音  	private String getCurrentTime(){  		SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");  		Date date=new Date(System.currentTimeMillis());  		String str=format.format(date);  		return str;  	} 	将时间转为计时格式	String showTimeCount(long time){		String s = null;		if (time <= 59) {			s = "00:";			return time<10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time);		}else{			return (time%60 <10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time))+ ":"+(time/60<10 ? s+"0"+String.valueOf(time) : s+String.valueOf(time));  		}	}}

布局一个Button,一个textView:

    

权限如下:

>

>

>

>

>

END

转载于:https://www.cnblogs.com/xiangevan/p/7818167.html

你可能感兴趣的文章
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>