1.简介

MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息。




2.MediaRecorder主要方法


2.1. 

方法:setAudioChannels(int numChannels) 

作用:设置录制的音频通道数。


2.2.

方法:setAudioEncoder(int audio_encoder) 

作用:设置audio的编码格式。


2.3.

方法:setAudioEncodingBitRate(int bitRate) 

作用:设置录制的音频编码比特率。



2.4.

方法:setAudioSamplingRate(int samplingRate) 

作用:设置录制的音频采样率。


2.5.

方法:setAudioSource(int audio_source) 

作用:设置用于录制的音源。


2.6.

方法:setAuxiliaryOutputFile(String path) 

作用:辅助时间的推移视频文件的路径传递。


2.7.

方法:setAuxiliaryOutputFile(FileDescriptor fd)

作用:在文件描述符传递的辅助时间的推移视频。


2.8.

方法:setCamera(Camera c)

作用:设置一个recording的摄像头。


2.9.

方法:setCaptureRate(double fps)

作用:设置视频帧的捕获率。


2.10.

方法:setMaxDuration(int max_duration_ms) 

作用:设置记录会话的最大持续时间(毫秒)。


2.11.

方法:setMaxFileSize(long max_filesize_bytes)

作用:设置记录会话的最大大小(以字节为单位)。


2.12.

方法:setOutputFile(FileDescriptor fd)

作用:传递要写入的文件的文件描述符。


2.13.

方法:setOutputFile(String path)

作用:设置输出文件的路径。


2.14.

方法:setOutputFormat(int output_format)

作用:设置在录制过程中产生的输出文件的格式。


2.15.

方法:setPreviewDisplay(Surface sv)

作用:表面设置显示记录媒体(视频)的预览。


2.16.

方法:setVideoEncoder(int video_encoder)

作用:设置视频编码器,用于录制。


2.17.

方法:setVideoEncodingBitRate(int bitRate)

作用:设置录制的视频编码比特率。


2.18.

方法:setVideoFrameRate(int rate)

作用:设置要捕获的视频帧速率。


2.19.

方法:setVideoSize(int width, int height)

作用:设置要捕获的视频的宽度和高度。


2.20.

方法:setVideoSource(int video_source)

作用:开始捕捉和编码数据到setOutputFile(指定的文件)。


2.21.

方法:setLocation(float latitude, float longitude)

作用:设置并存储在输出文件中的地理数据(经度和纬度)。


2.22.

方法:setProfile(CamcorderProfile profile)

作用:指定CamcorderProfile对象。


2.23.

方法:setOrientationHint(int degrees)

作用:设置输出的视频播放的方向提示。


2.24.

方法:setOnErrorListener(MediaRecorder.OnErrorListener l)

作用:注册一个用于记录录制时出现的错误的监听器。


2.25.

方法:setOnInfoListener(MediaRecorder.OnInfoListener listener)

作用:注册一个用于记录录制时出现的信息事件。


2.26.

方法:getMaxAmplitude()

作用:获取在前一次调用此方法之后录音中出现的最大振幅。


2.27.

方法:prepare()

作用:准备录制。


2.28.

方法:release()

作用:释放资源。


2.29.

方法:reset()

作用:将MediaRecorder设为空闲状态。


2.30.

方法:start()

作用:开始录制。


2.31.

方法:stop()

作用:停止录制。




3.MediaRecorder主要配置参数


3.1.视频编码格式MediaRecorder.VideoEncoder

      default,H263,H264,MPEG_4_SP,VP8


3.2.音频编码格式MediaRecorder.AudioEncoder

      default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS


3.3.视频资源获取方式MediaRecorder.VideoSource

      default,CAMERA,SURFACE


3.4.音频资源获取方式MediaRecorder.AudioSource

     defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,voice_recognition, voice_uplink


3.5.资源输出格式MediaRecorder.OutputFormat

    amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm




4.需要添加权限




5.使用MediaRecorder录制音频

代码


5.1.开始停止




5.2.开始录制




5.3.停止录制



5.4.效果图






6.使用MediaRecorder录制视频


6.1.代码

public class MediaRecorderVideoActivity extends AppCompatActivity implements SurfaceHolder.Callback{


    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private Button btnStartStop;
    private boolean isRecording = false;//标记是否已经在录制
    private MediaRecorder mRecorder;//音视频录制类
    private Camera mCamera = null;//相机
    private Camera.Size mSize = null;//相机的尺寸
    private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK;//默认后置摄像头
    private static final SparseIntArray orientations = new SparseIntArray();//手机旋转对应的调整角度


    static {
        orientations.append(Surface.ROTATION_0, 90);
        orientations.append(Surface.ROTATION_90, 0);
        orientations.append(Surface.ROTATION_180, 270);
        orientations.append(Surface.ROTATION_270, 180);
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setWindow();
        setContentView(R.layout.activity_mediarecordvideo);
        initViews();
    }


    private void setWindow() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
        // 设置竖屏显示
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        // 选择支持半透明模式,在有surfaceview的activity中使用。
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
    }


    private void initViews() {
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        btnStartStop = (Button) findViewById(R.id.btnStartStop);
        btnStartStop.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                if (!isRecording) {
                    startRecord();
                } else {
                    stopRecord();
                }
            }
        });
        SurfaceHolder holder = mSurfaceView.getHolder();// 取得holder
        holder.setFormat(PixelFormat.TRANSPARENT);
        holder.setKeepScreenOn(true);
        holder.addCallback(this); // holder加入回调接口
    }


    /**
     * 初始化相机
     */
    private void initCamera() {
        if (Camera.getNumberOfCameras() == 2) {
            mCamera = Camera.open(mCameraFacing);
        } else {
            mCamera = Camera.open();
        }


        CameraSizeComparator sizeComparator = new CameraSizeComparator();
        Camera.Parameters parameters = mCamera.getParameters();


        if (mSize == null) {
            List vSizeList = parameters.getSupportedPreviewSizes();
            Collections.sort(vSizeList, sizeComparator);


            for (int num = 0; num < vSizeList.size(); num++) {
                Camera.Size size = vSizeList.get(num);


                if (size.width >= 800 && size.height >= 480) {
                    this.mSize = size;
                    break;
                }
            }
            mSize = vSizeList.get(0);


            List focusModesList = parameters.getSupportedFocusModes();


            //增加对聚焦模式的判断
            if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
            } else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            }
            mCamera.setParameters(parameters);
        }
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int orientation = orientations.get(rotation);
        mCamera.setDisplayOrientation(orientation);
    }


    @Override
    protected void onResume() {
        super.onResume();
        initCamera();
    }


    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }


    /**
     * 开始录制
     */
    private void startRecord() {


        if (mRecorder == null) {
            mRecorder = new MediaRecorder(); // 创建MediaRecorder
        }
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.unlock();
            mRecorder.setCamera(mCamera);
        }
        try {
            // 设置音频采集方式
            mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            //设置视频的采集方式
            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            //设置文件的输出格式
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm
            //设置audio的编码格式
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            //设置video的编码格式
            mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            //设置录制的视频编码比特率
            mRecorder.setVideoEncodingBitRate(1024 * 1024);
            //设置录制的视频帧率,注意文档的说明:
            mRecorder.setVideoFrameRate(30);
            //设置要捕获的视频的宽度和高度
            mSurfaceHolder.setFixedSize(320, 240);//最高只能设置640x480
            mRecorder.setVideoSize(320, 240);//最高只能设置640x480
            //设置记录会话的最大持续时间(毫秒)
            mRecorder.setMaxDuration(60 * 1000);
            mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
            File dir = new File(Environment.getExternalStorageDirectory(),"Videos");
            if(!dir.exists()){
                dir.mkdirs();
            }


            File soundFile = new File(dir,System.currentTimeMillis()+".mp4");
            if(!soundFile.exists()){
                try {
                    soundFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //设置输出文件的路径
            mRecorder.setOutputFile(soundFile.getAbsolutePath());
            //准备录制
            mRecorder.prepare();
            //开始录制
            mRecorder.start();
            isRecording = true;
            btnStartStop.setText("停止");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 停止录制
     */
    private void stopRecord() {
        try {
            //停止录制
            mRecorder.stop();
            //重置
            mRecorder.reset();
            btnStartStop.setText("开始");
        } catch (Exception e) {
            e.printStackTrace();
        }
        isRecording = false;
    }


    /**
     * 释放MediaRecorder
     */
    private void releaseMediaRecorder() {
        if (mRecorder != null) {
            mRecorder.release();
            mRecorder = null;
        }
    }


    /**
     * 释放相机资源
     */
    private void releaseCamera() {
        try {
            if (mCamera != null) {
                mCamera.stopPreview();
                mCamera.setPreviewCallback(null);
                mCamera.unlock();
                mCamera.release();
            }
        } catch (RuntimeException e) {
        } finally {
            mCamera = null;
        }
    }


    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder
        mSurfaceHolder = surfaceHolder;
    }


    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder
        mSurfaceHolder = surfaceHolder;
        if (mCamera == null) {
            return;
        }
        try {
            //设置显示
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            e.printStackTrace();
            releaseCamera();
            finish();
        }
    }


    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        // surfaceDestroyed的时候同时对象设置为null
        if (isRecording && mCamera != null) {
            mCamera.lock();
        }
        mSurfaceView = null;
        mSurfaceHolder = null;
        releaseMediaRecorder();
        releaseCamera();
    }


    private class CameraSizeComparator implements Comparator {
        public int compare(Camera.Size lhs, Camera.Size rhs) {
            if (lhs.width == rhs.width) {
                return 0;
            } else if (lhs.width > rhs.width) {
                return 1;
            } else {
                return -1;
            }
        }
    }


}


6.2.效果



附:调用系统录音

代码


通过Intent调用系统的录音器功能,然后在录制完毕保存以后在onActivityResult中返回录制的音频的uri,然后通过Mediaplayer进行播放



调用系统的录音器

private final static int REQUEST_RECORDER = 100;
private Uri uri;
public void recorder_Intent(){
   Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
   startActivityForResult(intent,REQUEST_RECORDER);
}




获取返回的信息

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && REQUEST_RECORDER == requestCode){
        uri = data.getData();
    }

if (uri != null){
        if (mediaPlayer != null) {
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(RecorderActivity.this, uri);
                mediaPlayer.prepare();
                } catch (IOException e) {
                e.printStackTrace();
                }


        }else{
             Toast.makeText(RecorderActivity.this,"没有成功创建Mediaplayer",Toast.LENGTH_SHORT).show();
}
    }


}
  

更多相关文章

  1. Android(安卓)Retrofit + RxJava使用详解
  2. Android回音噪音处理Demo
  3. Android解决UnsupportedOperationException异常!
  4. 关于 android:windowSoftInputMode 的设置
  5. activity的启动过程分析
  6. Andorid入门--HTTP数据传输和WebView的使用
  7. Android获取控件的大小
  8. Android(安卓)隐藏软键盘的方式
  9. Gradle设置代码混淆

随机推荐

  1. Mars服务器和客户端demo运行教程
  2. Android中TextView文字设置不同的颜色
  3. Android对View的onMeasure方法理解
  4. android中onClick事件的实现
  5. adb monkey(详细分析)
  6. AOP面向切面编程
  7. android email 邮件转发 附件不能转发问
  8. android 布局之ConstraintLayout的使用
  9. Android开发环境的搭建方法
  10. Android(安卓)Binder Mechanism (4) --