zhoumy博客(C#、Windows Phone XAML)

Android视频录制从不入门到入门系列教程(二)————显示视频图像

1、创建一个空的工程,注意声明下列权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2、布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

很简单,就放了一个SurfaceView用来显示视频图像。

3、初始化摄像头

private void initCamera()
{
     camera = Camera.open();
}

通过Camera的open方法开启摄像头,open方法还有一个重载方法,主要用于告诉系统我要打开哪个摄像头,现在手机一般都是两个摄像头以上。默认打开的是后置摄像头。

4、释放摄像头

private void releaseCamera()
{
    if (camera != null)
    {
        // 释放前先停止预览
        camera.setPreviewCallback(null);
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

上面是几个比较重要的方法,下面是整个Activity的代码:

public class MainActivity extends AppCompatActivity
{
    private Camera camera;
    private SurfaceView surfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        initCamera();
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback()
        {
            @Override
            public void surfaceCreated(SurfaceHolder holder)
            {
                holder.removeCallback(this);
                try
                {
                    camera.setPreviewDisplay(holder);
                    camera.startPreview();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
            {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder)
            {

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

    private void initCamera()
    {
        camera = Camera.open();
    }
    
    private void releaseCamera()
    {
        if (camera != null)
        {
            // 释放前先停止预览
            camera.setPreviewCallback(null);
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }
}

值得一提的是,需要在SurfaceViewHolder创建之后,才能调用Camera的startPreview方法,否则视频图像是不会显示到SurfaceView中去的。

本篇文章DEMO下载

posted @ 2016-06-04 22:39  zhoumy  阅读(1128)  评论(0编辑  收藏  举报
zhoumy博客(C#、Windows Phone XAML)