Android多媒体--通过SurfaceView录像并存储

原创 2016年05月16日 23:27:28
  • 程序的简单逻辑就是当我们开启程序的时候,会在相应的surfaceView显示当前摄像头所显示的内容(此刻我们还没有开始录制),当我们点击录制,程序就开始录制视频了,当我们点击结束的时候,就自动将录制的视频保存到提前设定好的目录中。同时将surfaceView继续保持摄像头的预览的内容。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button button, button2;
    private SurfaceView surfaceView;
    private MediaRecorder mediaRecorder;
    private String path;
    private Camera camera;
    private SurfaceHolder.Callback callback;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initSurfaceView();
    }

    private void initSurfaceView() {

        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.setKeepScreenOn(true);
        callback = new SurfaceHolder.Callback() {

            //在控件创建的时候,进行相应的初始化工作
            public void surfaceCreated(SurfaceHolder holder) {
                //打开相机,同时进行各种控件的初始化mediaRecord等
                camera = Camera.open();
                mediaRecorder = new MediaRecorder();
            }

            //当控件发生变化的时候调用,进行surfaceView和camera进行绑定,可以进行画面的显示
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                doChange(holder);
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }

        };
        //为SurfaceView设置回调函数
        surfaceView.getHolder().addCallback(callback);
    }

    //当我们的程序开始运行,即使我们没有开始录制视频,我们的surFaceView中也要显示当前摄像头显示的内容
    private void doChange(SurfaceHolder holder) {
        try {
            camera.setPreviewDisplay(holder);
            //设置surfaceView旋转的角度,系统默认的录制是横向的画面,把这句话注释掉运行你就会发现这行代码的作用
            camera.setDisplayOrientation(getDegree());
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public int getDegree() {
        //获取当前屏幕旋转的角度
        int rotating = this.getWindowManager().getDefaultDisplay().getRotation();
        int degree = 0;
        //根据手机旋转的角度,来设置surfaceView的显示的角度
        switch (rotating) {
            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;
    }

    private void init() {
        button = (Button) findViewById(R.id.button);
        button2 = (Button) findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);

        path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/hello.3gp";
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                startRecord();
                break;
            case R.id.button2:
                stopRecord();
                break;
        }
    }

    private void stopRecord() {
        //当结束录制之后,就将当前的资源都释放
        mediaRecorder.release();
        camera.release();
        mediaRecorder = null;
        //然后再重新初始化所有的必须的控件和对象
        camera = Camera.open();
        mediaRecorder = new MediaRecorder();
        doChange(surfaceView.getHolder());
    }

    private void startRecord() {
        //先释放被占用的camera,在将其设置为mediaRecorder所用的camera
        camera.unlock();
        mediaRecorder.setCamera(camera);

        mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        //设置音频的来源  麦克风
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //设置视频的来源
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        //设置视频的输出格式  3gp
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //设置视频中的声音和视频的编码格式
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        //设置保存的路径
        mediaRecorder.setOutputFile(path);
        //开始录制
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 由于模拟器无法实现录制视频的功能,这里就不再截图贴出了,请自行尝试效果。

  • 这是一个简单的demo,其中会存在一些小bug,比如当我们的程序切换到后台就会报错,是因为我并未处理这些逻辑,仅仅是实现了录像功能的一个demo,有兴趣的再自己完善吧。

  • 如果想录制完毕后播放刚才录制的视频,请参看Android多媒体–音视频播放,里面讲解了如何播放音视频的操作。
版权声明:本文为博主原创文章,未经博主允许不得转载。

surfaceview自定义视频录制

  • 2014年08月12日 14:29
  • 1.41MB
  • 下载

Mediaplayer和surfaceview播放录制视频

视频的播放有三种:1.webview播放网页视频2.vedioview和mediacontroller3,mediaplayer和surfaceview播放视频,本文将介绍第三种 mediaplaye...
  • huangweishui
  • huangweishui
  • 2016年08月03日 10:28
  • 1353

录制视频(Surfaceview+MediaRecorder)

这个是自己写的录制视频,为了简单,全写在一个Activity中,可以切换照相机,没有带聚焦,需要聚焦自己写个OnTouch即可。在我的测试机上跑起来畅通无阻,我只有3个测试机。如果你使用了我的有问题可...
  • ning_gg
  • ning_gg
  • 2017年01月10日 15:24
  • 484

Android MediaProjection截屏与录屏(surfaceview截图)(一)

MediaProjection 和 MediaProjectionManager 是 Android 5.0 开放的屏幕截图与录制视频的接口,它可以用来对 surfaceview 进行截图,解决以前 ...
  • u010057266
  • u010057266
  • 2016年12月05日 21:11
  • 4132

安卓使用surfaceview+Camera+MediaRecorder实现视频录制

录制视频代码:public class RecordVideoActivity extends Activity implements SurfaceHolder.Callback { pri...
  • github_36713209
  • github_36713209
  • 2017年02月09日 14:16
  • 2380

使用MediaRecorder+SurfaceView实现录像

实现录像的前提是必须获取的手机的摄像头,这里我只获取了后置摄像头 这些都需要早在清单文件中 ...
  • qq_34078119
  • qq_34078119
  • 2017年02月23日 01:23
  • 393

MediaCodec 从Surface编码及android锁屏录像和后台录像实现

.
  • ilotuo
  • ilotuo
  • 2016年06月30日 16:44
  • 4281

android 视频录制 保存到本地

android 视频录制 保存到本地
  • liudao7994
  • liudao7994
  • 2016年07月27日 16:48
  • 2643

Android使用SurfaceView和TextureView来播放视频

最近项目中在调试一个问题:app端呈现摄像头画面的调整,很坑的一个问题。项目经理估计搞不定,就把这个问题扔给我了,有点坑啊。因为播放摄像头视频的控件是继承于surfaceview的,于是乎就从surf...
  • wufeiqing
  • wufeiqing
  • 2017年07月02日 17:30
  • 1767

自定义surfaceview画图并保存Canvas到DCIM

自定义surfaceview package com.app.fantasticbaby; import java.io.File; import java.io.FileNotFoun...
  • u010015933
  • u010015933
  • 2016年05月30日 15:49
  • 748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android多媒体--通过SurfaceView录像并存储
举报原因:
原因补充:

(最多只允许输入30个字)