Android-音视频(9):MediaRecorder录制音视频

1.简述


看了前面的录制音视频是不是觉得很麻烦,如采集数据源,格式转换,编码压缩,混合数据。基本上每一步都需要一个单独的类。

前面我们在说AudioRecord录音的时候说了MediaRecorder也可以录音。其实MediaRecorder也可以单独录视频,也可以录制音视频。用MediaRecorder录制就非常方便了,因为它集上面的每一步于一身,通过方法设置参数,使用它,很快就能录制一个音视频

2.API介绍


虽然很简单,但是如果一开始就直接上手实践,必然会有一些BUG你没注意到。所以在看代码之前,来排查一下需要注意的地方,不然程序一运行就会崩溃。

//初始化
mediaRecorder = new MediaRecorder();
//将MediaRecorder重新启动到其空闲状态
                mediaRecorder.reset();
                //设置声音来源 和 视频来源
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                //设置输出文件的格式,必须在设置编码格式之前设置
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                //设置编码格式 音频 和 视频 编码格式要设置正确,不然有时候录制黑屏
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                //设置分辨率,可以改变清晰度 这个值没设置对的话会崩溃  在编码格式之后设置 可以默认
                mediaRecorder.setVideoSize(1920,1080);
                //设置帧率,每秒5帧 这个值没设置对的话会崩溃  在编码格式之后设置
                mediaRecorder.setVideoFrameRate(5);
                // 设置位率,不设置可能画质不清晰
                mediaRecorder.setVideoEncodingBitRate(1920*1080*5);
                // 输出旋转90度播放时,但是预览时没有旋转90度,预览由Camera决定
                mediaRecorder.setOrientationHint(90);
                //设置输出文件位置 注意这里不是传入一个文件,而是路径
                mediaRecorder.setOutputFile(avfile.getAbsolutePath());
                //设置预览
                mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
                //准备录制
                mediaRecorder.prepare();
                //开始录制
                mediaRecorder.start();
//停止录制
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;

3.代码


如果上面一些需要注意的点都注意到了,那么录制一个音视频就没有问题了。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    SurfaceView surfaceView;
    Button record;
    Button stop;
    MediaRecorder mediaRecorder;
    File avfile; //存储位置
    //标志
    private boolean isRecording = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        record = (Button) findViewById(R.id.recoed);
        record.setOnClickListener(this);
        stop = (Button) findViewById(R.id.stop);
        stop.setOnClickListener(this);
        stop.setEnabled(false);

        surfaceView = (SurfaceView) findViewById(R.id.sView);
        //可以不设置,但是设置了就必须和MediaRecorder的分辨率一样
//        surfaceView.getHolder().setFixedSize(1920,1080);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.recoed:
                //文件保存位置
                avfile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"test.mp4");

                if (avfile.exists()){
                    avfile.delete();
                }
                try {
                    avfile.createNewFile();
                } catch (IOException e) {
                }
                mediaRecorder = new MediaRecorder();
//*******************************************
                //预览时旋转90度正常
                Camera camera = Camera.open();
                camera.setDisplayOrientation(90);
                Camera.Parameters params = camera.getParameters();
                //自动聚焦,不然的话可嫩不清晰
                params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
                camera.setParameters(params);
                //解锁相机允许另一个进程访问它
                camera.unlock();
                mediaRecorder.setCamera(camera);
//********************************************
                mediaRecorder.reset();
                //设置声音来源 和 视频来源
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                //设置输出文件的格式,必须在设置编码格式之前设置
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                //设置编码格式 音频 和 视频 格式要设置正确,不然有时候录制黑屏
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                //设置分辨率,可以改变清晰度 这个值没设置对的话会崩溃  在编码格式之后设置 可以默认
                mediaRecorder.setVideoSize(1920,1080);
                //设置帧率,每秒25帧 这个值没设置对的话会崩溃  在编码格式之后设置
                mediaRecorder.setVideoFrameRate(5);
                // 设置位率,不设置可能画质不清晰
                mediaRecorder.setVideoEncodingBitRate(1920*1080*5);
                // 输出旋转90度播放时,但是预览时没有旋转90度,预览由Camera决定
                mediaRecorder.setOrientationHint(90);
                //设置输出文件位置 注意这里不是传入一个文件,而是路径
                mediaRecorder.setOutputFile(avfile.getAbsolutePath());
                //设置预览
                mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
                //准备录制
                try {
                    mediaRecorder.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //开始录制
                mediaRecorder.start();
                //
                Toast.makeText(this, "开始录制...", Toast.LENGTH_SHORT).show();
                record.setEnabled(false);
                stop.setEnabled(true);
                isRecording = true;
                break;
            case R.id.stop:
                if (isRecording){
                    //停止录制
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                    //
                    record.setEnabled(true);
                    stop.setEnabled(false);
                }
                break;
            default:
                break;
        }
    }

}

上面代码加入了视频录制预览时旋转了90度,和数据存文件时也旋转了90度,这样在录制和播放的时候就不会奇怪了。

然后还加入了持续自动聚焦的能力,使录制更清晰。

手机需要权限如下:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

是不是很简单!

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/82955966