錄製視頻之MediaRecorder

Android系統提供了MediaRecorder類用來在應用中錄製視頻
使用步驟如下:
1、創建MediaRecorder對象
2、調用MediRecorder對象的setAudioSource()方法設置聲音的來源,一般傳入MediaRecorder.MIC
3、調用MediaRecorder對象的setOutputFormat()設置所錄製的音頻文件的格式
4、調用MediaRecorder對象的setAudioRncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamlingRate(int SamplingRate)設置所錄音的編碼格式、編碼位率、採樣率等,
5、調用MediaRecorder對象的setOutputFile(String path)方法設置錄製的音頻文件的保存位置
6、調用MediaRecoder對象的Prepare()方法準備錄製
7、調用MediaRecoder對象的start()方法開始錄製
8、調用MediaRecoder對象的stop()方法停止錄製,並調用release()方法釋放資源

MediaRecorder狀態圖如下:
這裏寫圖片描述

需要加權限

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.CAMERA"/>
package com.example.mediarecord;

import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button mButton1,mButton2,mButton3,mButton4;
    private SurfaceView mSurfaceView;
    private MediaPlayer mediaPlayer;
    private MediaRecorder mediaRecorder;
    private String FilePath=null;
    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton1= (Button) findViewById(R.id.btn_start);
        mButton2= (Button) findViewById(R.id.btn_stop);
        mButton3= (Button) findViewById(R.id.btn_prepare);
        mButton4= (Button) findViewById(R.id.btn_pause);
        mSurfaceView= (SurfaceView) findViewById(R.id.surface_view);
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
        mButton3.setOnClickListener(this);
        mButton4.setOnClickListener(this);
        mediaPlayer=new MediaPlayer();
     //設置屬性識別
        mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        //設置屏幕高亮
        mSurfaceView.setKeepScreenOn(true);
        FilePath= Environment.getExternalStorageDirectory().getPath()+"/Download/record.3gp";
        //surfaceView的監聽事件 回調函數
        mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                //打開camera 即初始化camera
                camera=Camera.open();
                mediaRecorder=new MediaRecorder();
            }
              //當控件發生變化時
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                try {
                    //預覽
                    camera.setPreviewDisplay(mSurfaceView.getHolder());

                    camera.setDisplayOrientation(getDegree(MainActivity.this));


                } catch (IOException e) {
                    e.printStackTrace();
                }
                camera.startPreview();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });


    }

    private int getDegree(Activity activity) {
        //得到攝像頭本身的角度
        int rotation=activity.getWindowManager().getDefaultDisplay().getRotation();
        //給角度一個初始值
        int degree=0;
        switch (rotation){
            case Surface.ROTATION_0:
                degree=90;
                break;
            case Surface.ROTATION_90:
                degree=0;
                break;
            case Surface.ROTATION_180:
                degree=270;
                break;
            case Surface.ROTATION_270:
                degree=180;
                break;
        }
        return degree;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_start:
                startRecord();
                break;
            case R.id.btn_stop:
                mediaRecorder.release();
                //camera被佔用,所以應釋放,然後讓他等於空
                camera.release();
                camera=null;

                break;
            case R.id.btn_prepare:
                startPlay();
                break;
            case R.id.btn_pause:
                break;
        }
    }
    public void startRecord()  {
    //camera被佔用時,start會報錯,將camera釋放掉,然後再與MediaRecoder進行綁定
        camera.unlock();
        mediaRecorder.setCamera(camera);
        //錄製關聯
        mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
       //設置音頻視頻來源
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setOutputFile(FilePath);

        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);



        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaRecorder.start();
    }

    public void startPlay(){
        try {
            mediaPlayer.setDisplay(mSurfaceView.getHolder());
            mediaPlayer.setDataSource(FilePath);
            mediaPlayer.prepare();
            mediaPlayer.seekTo(0);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章