android录制视频实现

Android视频录制使用MediaRecorder来录制,SurfaceView来预览视频


与录制音频类似,录制视频的步骤为:

1.  构造MediaRecorder对象

2.  设置视频的声音和视频来源

3.  设置视频文件的输出格式    //   3必须在4 之前

4.  设置视频图像的编码格式

5.  设置保存到文件

6.  使用SurfaceView预览视频

7.  mediaRecorder.prepre() 和 mediaRecorder.start()

停止视频录制采用mediaRecorder.stop(),mediaRecorder.release();


编写布局文件:



    
    
        
编写Activity:
public class RecordVedio extends Activity implements View.OnClickListener{
    MediaRecorder mediaRecorder;
    File videoFile;
    Button record,stop;
    SurfaceView surfaceView;
    private boolean isRecording = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.record_video);
        record = (Button) findViewById(R.id.record);
        stop = (Button) findViewById(R.id.stop);

        surfaceView = (SurfaceView) findViewById(R.id.sView);
        //  设置Surface不用自己维护缓冲区
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        //  设置分辨率
        surfaceView.getHolder().setFixedSize(320,280);
        //  设置该组件不会让屏幕自动关闭
        surfaceView.getHolder().setKeepScreenOn(true);
        record.setOnClickListener(this);
        stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.record:
                recordVideo();
                break;
            case R.id.stop:
                if(isRecording){
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                    record.setEnabled(true);
                    stop.setEnabled(false);
                    isRecording = false;
                }
                break;
        }
    }

    private void recordVideo(){
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Toast.makeText(RecordVedio.this, "SD卡未找到", Toast.LENGTH_SHORT).show();
            return;
        }
        try {
            videoFile = new File(Environment.getExternalStorageDirectory().getCanonicalPath()+
                    "/myvideo.mp4");
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(mediaRecorder == null){
            mediaRecorder = new MediaRecorder();
        }
        mediaRecorder.reset();
        //  设置视频声音的来源
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //  设置视频来源
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        //  设置视频文件的输出格式
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        //  设置声音的编码格式
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        //  设置视频的编码格式
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        // 设置录制的视频的宽高
//        mediaRecorder.setVideoSize(320,280);
//        //  设置视频帧数/秒
//        mediaRecorder.setVideoFrameRate(4);
        //  设置视频保存到文件
        mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
        //  将视频显示到SurfaceView上
        mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
            record.setEnabled(false);
            stop.setEnabled(true);
            isRecording = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onDestroy() {
        mediaRecorder.stop();
        mediaRecorder.release();
        mediaRecorder = null;
        super.onDestroy();
    }
}

加上权限:


    
    
    
出现过的问题:

1.  之前使用了下面两句,发现不能录制,原因是我的手机摄像头不一定支持下面的属性设置,去掉就行

 // mediaRecorder.setVideoSize(320,280);
//        //  设置视频帧数/秒
//        mediaRecorder.setVideoFrameRate(4);
2.  录制视频是发现视频总是旋转了90度,在AndroidManifest.xml文件中对实现屏幕捕捉的Activity增加如下属性值:

<activity android:name=".ScreenCapture" android:screenOrientation="landscape">




你可能感兴趣的:(android案例)