椭圆-状态、单弧线-同步调用、双弧线-异步调用
一,Initial(初始状态)
MediaRecorder mRecorder = new MediaRecorder();
当使用new()方法创建一个MediaRecorder对象或者调用了reset()方法时,该MediaRecorder对象处于Initial状态。在设定视频源或者音频源之后将转换为Initialized状态。另外,在除Released状态外的其它状态通过调用reset()方法都可以使MediaRecorder进入该状态。
二,Initialized(已初始化状态)
//设置声音来源MIC
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。这两个方法用于设置音视频的源配置,通常音频音频是麦克风,视频是摄像头。该状态可以通过reset()方法回到initial()方法。
在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为DataSourceConfigured状态。
三,DataSourceConfigured(数据源配置状态)
//设置输出格式
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//mp3
//设置输出文件
mRecorder.setOutputFile(soundFile.getPath());
//设置编码
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。
可以在Initialized状态通过setOutputFormat()方法进入该状态。另外,可以通过reset()方法回到Initial状态,或者通过prepare()方法到达Prepared状态。
四,Prepared(就绪状态)
//准备录制
mRecorder.prepare();
只有处于就绪状态,才能调用start()
五,Recording(录制状态)
录制状态,可以在Prepared状态通过调用start()方法进入该状态。另外,它可以通过stop()方法或reset()方法回到Initial状态。
六,Released(释放状态),Error(错误状态)
mRecorder.stop();
mRecorder.release();
mRecorder=null;
释放状态:可以通过在Initial状态调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。
错误状态:当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。
其中还需要你手动开启设置——我的应用——你的应用点击——开启麦克风和存储权限
或
添加动态权限,用户如果取消则依旧无法使用
- 录制音频无法在虚拟机上使用!
- 需要确保API>=28
一,音频来源
二,输出格式
三,音频编码
import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ImageButton;
import java.io.File;
import java.io.IOException;
public class MainActivity extends Activity implements View.OnClickListener {
private ImageButton bofang,zating;
private File soundFile;
private MediaRecorder mRecorder;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bofang = findViewById(R.id.play);
zating = findViewById(R.id.zating);
bofang.setOnClickListener(this);
zating.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()){
case R.id.play:
play();
break;
case R.id.zating:
pause();
break;
}
}
public void play() {
try {
//创建要录制的文件
soundFile = new File(Environment.getExternalStorageDirectory(),+System.currentTimeMillis()+".mp3");
//创建录制
mRecorder = new MediaRecorder();
//设置声音来源MIC
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置输出格式
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//mp3
//设置输出文件
mRecorder.setOutputFile(soundFile.getPath());
//设置编码
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//准备录制
mRecorder.prepare();
//录制
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void pause() {
if(soundFile!=null&&soundFile.exists()){
mRecorder.stop();
mRecorder.release();
mRecorder=null;
}
}
}
其中还需要你手动开启设置——我的应用——你的应用点击——开启麦克风和存储权限
或
添加动态权限,用户如果取消则依旧无法使用
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import java.io.File;
public class MainActivity extends Activity{
private ImageButton button;
// 系统的视频文件
private File videoFile;
private MediaRecorder mRecorder;
// 显示视频预览的SurfaceView
private SurfaceView surfaceView;
// 记录是否正在进行录制
private boolean isRecording = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestPermissions(new String[]{Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE},0x123);
surfaceView = findViewById(R.id.sView);
// 设置该组件让屏幕不会自动关闭
surfaceView.getHolder().setKeepScreenOn(true);
button = findViewById(R.id.start);
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
if (requestCode == 0x123&&grantResults.length==3&&grantResults[0]==PackageManager.PERMISSION_GRANTED) {
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
if(!isRecording){
// 创建保存录制视频的视频文件
videoFile = new File(Environment.getExternalStorageDirectory()
, "/my.mp4");
// 创建MediaPlayer对象
mRecorder = new MediaRecorder();
mRecorder.reset();
// 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)
mRecorder.setAudioSource(MediaRecorder
.AudioSource.CAMCORDER);
// 设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder
.VideoSource.CAMERA);
// 设置视频文件的输出格式
// 必须在设置声音编码格式、图像编码格式之前设置
mRecorder.setOutputFormat(MediaRecorder
.OutputFormat.MPEG_4);
// 设置声音编码的格式
mRecorder.setAudioEncoder(MediaRecorder
.AudioEncoder.DEFAULT);
// 设置图像编码的格式
mRecorder.setVideoEncoder(MediaRecorder
.VideoEncoder.H264);
mRecorder.setVideoSize(1280, 720);
// 每秒 4帧
//mRecorder.setVideoFrameRate(20);
mRecorder.setOutputFile(videoFile.getAbsolutePath());
// 指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(surfaceView
.getHolder().getSurface());
try {
mRecorder.prepare();
} catch (Exception e) {
e.printStackTrace();
}
// 开始录制
mRecorder.start();
isRecording=true;
button.setImageResource(R.drawable.zanting);
}else{
mRecorder.setOnErrorListener(null);
mRecorder.setOnInfoListener(null);
mRecorder.setPreviewDisplay(null);
mRecorder.stop();
mRecorder.release();
mRecorder = null;
button.setImageResource(R.drawable.bofang);
}
}
};
button.setOnClickListener(listener);
}
}
}