基于android的远程视频监控系统——实现,

标签: android 视频 监控 | 发表时间:2012-09-03 11:54 | 作者:amyy
出处:http://www.cnblogs.com/

本帖仅献给和我一样热爱 Android开发,并渴望学习的朋友们。
现在我将分享我的学习过程,希望大家通过学习也能够独立完成这个简单的系统。
(PS.这个系统是我在学习java和android一个月的时间内鼓捣出来的,所以没有基础的朋友也不要担心。分几步,一切就简单了)

如标题所述,今天我们将学习如何打开摄像头,并在屏幕上预览图像。使用Camera的步骤:
(1)调用Camera的open()方法打开相机;
(2)调用Camera的getParameters()方法获取拍照参数,该方法返回一个Camera.Parameters对象;
(3)调用Camera的setParameters()方法//android2.3.3以后无需此步;
(4)调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个surfaceview来显示取景图片;
(5)结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。
以上过程参考《疯狂android讲义》,这本书确实不错,能够快速入门。整个系统大部分框架是参考此书的,部分问题在网上搜的资料。

1.在AndroidManifest.xml文件中添加camera的权限

    <!-- 授予程序使用摄像头的权限 -->        <uses-permission android:name="android.permission.CAMERA" />         <uses-feature android:name="android.hardware.camera" />         <uses-feature android:name="android.hardware.camera.autofocus" />

2.在界面布局文件中添加一个surfaceview用于显示预览图片

<SurfaceView        android:id="@+id/sView"        android:layout_width="fill_parent"         android:layout_height="fill_parent"        />

3.程序主体
在这里我们定义了一个SurfaceView变量sView用于获取布局文件中定义的SurfaceView组件。
我们在SurfaceView被创建时调用initcamera()初始化摄像头,在SurfaceView被销毁时释放摄像头。而这两个时间是通过surfaceHolder.addCallback得到的,看看下面代码就明白了。

public class MainActivity extends Activity {        SurfaceView sView;        SurfaceHolder surfaceHolder;        int screenWidth, screenHeight;        // 定义系统所用的照相机        Camera camera;        //是否在浏览中        boolean isPreview = false;    @Override        public void onCreate(Bundle savedInstanceState)        {                super.onCreate(savedInstanceState);                // 设置全屏                requestWindowFeature(Window.FEATURE_NO_TITLE);                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN);                setContentView(R.layout.activity_main);                WindowManager wm = (WindowManager) getSystemService(                        Context.WINDOW_SERVICE);                Display display = wm.getDefaultDisplay();                // 获取屏幕的宽和高                screenWidth = display.getWidth();                screenHeight = display.getHeight();                // 获取界面中SurfaceView组件                sView = (SurfaceView) findViewById(R.id.sView);                // 获得SurfaceView的SurfaceHolder                surfaceHolder = sView.getHolder();                // 为surfaceHolder添加一个回调监听器                surfaceHolder.addCallback(new Callback()                {                        @Override                        public void surfaceChanged(SurfaceHolder holder, int format, int width,                                int height)                        {                        }                        @Override                        public void surfaceCreated(SurfaceHolder holder)                        {                                // 打开摄像头                                initCamera();                        }                        @Override                        public void surfaceDestroyed(SurfaceHolder holder)                        {                                // 如果camera不为null ,释放摄像头                                if (camera != null)                                {                                        if (isPreview)                                                camera.stopPreview();                                        camera.release();                                        camera = null;                                }                        }                                });                // 设置该SurfaceView自己不维护缓冲                    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        }        private void initCamera()        {                if (!isPreview)                {                        camera = Camera.open();                }                if (camera != null && !isPreview)                {                        try                        {                                Camera.Parameters parameters = camera.getParameters();                                // 设置预览照片的大小                                parameters.setPreviewSize(screenWidth, screenHeight);                                // 每秒显示4帧                                parameters.setPreviewFrameRate(4);                                // 设置图片格式                                parameters.setPictureFormat(PixelFormat.JPEG);                                // 设置JPG照片的质量                                parameters.set("jpeg-quality", 85);                                //设置照片的大小                                parameters.setPictureSize(screenWidth, screenHeight);                                //android2.3.3以后无需下步                                //camera.setParameters(parameters);                                //通过SurfaceView显示取景画面                                camera.setPreviewDisplay(surfaceHolder);                                // 开始预览                                camera.startPreview();                                // 自动对焦                                camera.autoFocus(null);                        }                        catch (Exception e)                        {                                e.printStackTrace();                        }                        isPreview = true;                }        }    }

就这样你就可以使用摄像头预览了。当然你会发现预览的图像转了90度,方向不对。我们在AndroidManifest.xml文件的activity属性设置中添加。

android:screenOrientation="landscape"

设置成横屏就OK了。如果黑屏请检查camera.setParameters(parameters);这步是否与自己系统匹配,2.3.3以后是不须此步的。
就这样简单,我们就完成了无线视频监控的第一步,实现了摄像头图像的预览。在这里我们设置了预览但是却没有对每帧图像数据进行处理,下次将讲如何获得摄像头的每一帧图像以及如何处理。

下面是sdk2.3.3下的源码,在我android4.04系统的手机上也能运行。由于android开发工具的升级,这个源码包跟以前版本有所不同,不知道和旧版本是否有冲突。如过不行大家新建个工程,再把3个关键文件的内容复制过去应该没问题。

源码:

CameraPreview.rar

本文链接

相关 [android 视频 监控] 推荐:

基于android的远程视频监控系统——实现,

- - 博客园_首页
本帖仅献给和我一样热爱 Android开发,并渴望学习的朋友们. 现在我将分享我的学习过程,希望大家通过学习也能够独立完成这个简单的系统. (PS.这个系统是我在学习java和android一个月的时间内鼓捣出来的,所以没有基础的朋友也不要担心. 如标题所述,今天我们将学习如何打开摄像头,并在屏幕上预览图像.

Android视频录制

- - CSDN博客移动开发推荐文章
/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/. this.surfaceView.getHolder().setFixedSize(320, 240);//设置分辨率. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频.

Android 开发视频推荐

- - 大猫の意淫筆記
作为 Android 死忠粉,总是想自己来两手,无奈没摸过后台开发,面向的唯一对象就是马总. 花了个把星期入个门,发现还是挺好玩的. 市面上的 Android 入门书有2个主要问题,一个是都要求有 Java 基础,另一个是跟不上 Android 版本更新.所以并不推荐买书学习. 斯坦福大学公开课:编程方法学.

ZoneMinder 1.25 发布,视频监控系统

- 迎客松 - LinuxEden开源社区-Linux伊甸园
ZoneMinder的作者是因為家中的車庫被竊,因而產生設計監控保全的念頭. ZoneMinder使用了Linux Server,PHP,MySQL加上幾支攝影機,就可以使用web介面監控重要場所. 當異常事件發生時,你就可以收到e-mail或簡訊通知. 阅读全文 | 邮件推荐 | 评论回复.

视频监控P2P解决方案

- -
本文分析了日益增长的民用级别家庭和个人网络视频监控市场的需求特点,并给出了一种经济可行易于大规模部署的P2P解决方案. 由于篇幅有限,本文只给出了方案的思路,未对更深入的技术细节做详细的论述,有兴趣的朋友可以继续深入研究. 网络视频监控市场持续火爆升温,除了公共安全市场持续高速增长之外,民用市场中家庭和个人视频监控的需求近年也在逐渐增多.

android应用程序线程的监控

- - CSDN博客推荐文章
所以就开始研究起来,经过半天的模式总用有点启发,下面就简单介绍一个简单的线程监控:. DDMS是一款Google* 提供的应用,可作为独立的工具运行,也可通过ADT Eclipse* 插件集成到Eclipse* 中. 它提供了强大的特性集合,能帮助您快速了解应用的运行状况. 线程更新DDMS中的线程监控和评测浏览对于管理大量线程的应用很有用.

Google+ Android 应用已支持 NFC [视频]

- 太平犬 - 谷安——谷奥Android专题站
Google 喜欢将自己不同的技术和服务搞到一起,取长补短彼此促进,看起来 Google+ 也不例外. 通过带有 NFC 的手机,Google+ 应用可以读取 NFC 标签从而快速分享内容. 当然直到 NFC 普及之前估计难火热起来. Google 已经宣传 NFC(near-field communications/近场通信)有一段时间,他们还推出了基于 NFC 的 Google Wallet(Google 钱包)服务.

MegaPad,23 英寸的 Android 平板?[视频]

- SotongDJ - 谷安——谷奥Android专题站
你可能已经有了 10 英寸平板,不过你想要个更大的屏幕么. Android 改装发烧友 Martin Drashkov 就有这样的想法,因为它构建了一个 23 英寸的触屏 Android 设备. 他将这个设备称为 MegaPad,而且它只花了 600 美刀左右就炮制出来了. Martin 认为更大的屏幕可以让“两个人同时使用”而且“也有同时开启两个不同需求的应用的可能性”.

Android 4.0 首个使用视频曝光

- 猪头小队长 - 爱范儿 · Beats of Bits
这年头各个公司的曝光策略似乎都不一样,苹果那边是几年如一日的保护壳曝光、酒吧丢手机;Google 似乎更偏爱 Ebay 一点,有人从 Ebay 上买到了一台 Nexus S,然后他惊奇地发现,系统居然是即将发布的 Android 4.0 冰淇淋三明治. 他很快拍摄了一段视频,并发给 Engadget.

下一代Android运行视频曝光

- Adam - cnBeta.COM
不用像在酒吧里面等待遗失的新iPhone那样麻烦,代号冰淇淋三明治的下一代Android操作系统已经亮相,近日在eBay上有网友在出售一款Nexus S,特别之处就在于该机运行有最新的下一代Android操作系统.