Android:MediaRecoder——录制音视频

一,理论知识

椭圆-状态、单弧线-同步调用、双弧线-异步调用

Android:MediaRecoder——录制音视频_第1张图片

一,Initial(初始状态)

Android:MediaRecoder——录制音视频_第2张图片

MediaRecorder mRecorder = new MediaRecorder();

当使用new()方法创建一个MediaRecorder对象或者调用了reset()方法时,该MediaRecorder对象处于Initial状态。在设定视频源或者音频源之后将转换为Initialized状态。另外,在除Released状态外的其它状态通过调用reset()方法都可以使MediaRecorder进入该状态。

,Initialized(已初始化状态)

Android:MediaRecoder——录制音视频_第3张图片

 

//设置声音来源MIC
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。这两个方法用于设置音视频的源配置,通常音频音频是麦克风,视频是摄像头。该状态可以通过reset()方法回到initial()方法。

在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为DataSourceConfigured状态。

三,DataSourceConfigured(数据源配置状态)

Android:MediaRecoder——录制音视频_第4张图片

//设置输出格式
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//mp3
//设置输出文件
mRecorder.setOutputFile(soundFile.getPath());
//设置编码
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。

可以在Initialized状态通过setOutputFormat()方法进入该状态。另外,可以通过reset()方法回到Initial状态,或者通过prepare()方法到达Prepared状态。

四,Prepared(就绪状态)

Android:MediaRecoder——录制音视频_第5张图片

//准备录制
mRecorder.prepare();

只有处于就绪状态,才能调用start()

五,Recording(录制状态)

Android:MediaRecoder——录制音视频_第6张图片

录制状态,可以在Prepared状态通过调用start()方法进入该状态。另外,它可以通过stop()方法或reset()方法回到Initial状态。

六,Released(释放状态),Error(错误状态)

Android:MediaRecoder——录制音视频_第7张图片

mRecorder.stop();
mRecorder.release();
mRecorder=null;

释放状态:可以通过在Initial状态调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。

错误状态:当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。

二,录制音频

一,前提需要


其中还需要你手动开启设置——我的应用——你的应用点击——开启麦克风和存储权限

添加动态权限,用户如果取消则依旧无法使用

  1. 录制音频无法在虚拟机上使用!
  2. 需要确保API>=28

二,参数设置

一,音频来源

Android:MediaRecoder——录制音视频_第8张图片

二,输出格式

Android:MediaRecoder——录制音视频_第9张图片

三,音频编码

Android:MediaRecoder——录制音视频_第10张图片

三,录音代码

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);
        }
    }
}

 

你可能感兴趣的:(Android)