android录制视频实现

来源:互联网 发布:去重sql语句 distinct 编辑:程序博客网 时间:2024/03/29 16:17

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


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

1.  构造MediaRecorder对象

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

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

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

5.  设置保存到文件

6.  使用SurfaceView预览视频

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

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


编写布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <SurfaceView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/sView"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:gravity="center"        >        <Button            android:id="@+id/record"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="record"/>        <Button            android:id="@+id/stop"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="stop"/>    </LinearLayout></RelativeLayout>
编写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();    }}

加上权限:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.CAMERA" />
出现过的问题:

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

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

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




1 0