zoukankan      html  css  js  c++  java
  • 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下载

  • 相关阅读:
    关于上传组件
    二分查找的时间复杂度
    commander.js
    执行上下文
    谷歌插件开发
    网站性能
    日记
    <<人间失格>>阅读
    Node.js 应该用在什么地方
    浅谈前后端分离与实践 之 nodejs 中间层服务
  • 原文地址:https://www.cnblogs.com/DoNetCoder/p/5559714.html
Copyright © 2011-2022 走看看