让Android的emulator支持web camera

emulator的camera没有支持动态获取图像的功能。所能用到的是像下面那样的,很不爽。

image

下面介绍如何在程序中支持web camera。

我们要用到的方法是http://www.tomgibara.com/android/camera-source介绍的。基本上就是利用socket或者http的方式从webcam中获取图像。更进一步,如果你连webcam都不方便安装的话,可以使用虚拟摄像头。下面我们分别介绍这两种方法(socket和http)。

OK,请准备一下一些资源。

1. JMF

这个可以提供socket方式的图像获取。

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html下载。(第一次看到这个页面可能有点晕,页面最下面Downloads里面有下载链接Download JMF

2. Virtual Camera

这个就是我们的视频图像源了,可以通过播放本地视频文件等方式模拟摄像头的行为。

网上应该有很多,我使用的是从http://www.onlinedown.net/softdown/47920_2.htm下载的。

3. Web Camera 2000

这个软件可以抓取摄像头的图像并用内嵌的web server让外部以http的方式获取图像,好强大。

4. IntelliJ或者Eclipse

目前用过这两个android的IDE,还是觉得IntelliJ好用些。没有恶心的Pem/Gen error,并且自动提示在10.0+版本有很好的表现。关于如何建立开发环境可以google/baidu一下子。

我们要用到http://www.tomgibara.com/android/camera-source里面的两个类:HttpCamera和SocketCamera。

下面介绍一下Socket方式的软件安装配置要点。

我的桌面环境是windows 7 Ultimate。windows xp/vista应该更简单一些。Linux的自己摸索一下了,应该类似。

1. Virtual Camera

安装好以后选择Source->Video/Image Files,程序自带了一个美女视频播放起来,这样你的摄像头就建好了。

image

2. JMF

装好以后,以管理员权限运行C:\Program Files\JMF2.1.1e\bin\jmfinit.exe。这样你的摄像头就应该能被识别了。可以用jmstudio.exe的File->Capture功能确认一下。

image

image

image

OK,JMF和Camera可以连起来工作了。

3. 在自己的程序中使用Socket方式获取图像

比如在自定义控件中使用以下代码:

private void capture(Canvas canvas) {
        CameraSource cs = new SocketCamera("192.168.1.27", 9889, 320, 240, true);
        if (!cs.open()) {
            // give some error message here….
        }

        //capture the frame onto the canvas
        if(!cs.capture(canvas)) {
            // give some error message here….
        }

        cs.close();
    }

下面介绍一下HTTP方式的安装配置要点。

1. Virtual Camera

跟上面一样,不赘述

2. Web Camera 2000

这个程序不用安装,直接解压缩就可以了。从Video菜单选择设备就可以播放了。

image

还可以设置Enable Web Server以及端口号。

image

3. 在自己的程序中使用Http方式获取图像

比如在自定义控件中使用以下代码:

private void capture(Canvas canvas) {
        CameraSource cs = new HttpCamera(http://192.168.1.27:8080, 320, 240, true);
        if (!cs.open()) {
            // give some error message here….
        }

        //capture the frame onto the canvas
        if(!cs.capture(canvas)) {
            // give some error message here….
        }

        cs.close();
    }

小提示:

可以在onDraw()中使用invalidate()来反复刷新界面,模拟动画效果。

好的,祝各位调试愉快。

posted @ 2010-12-30 22:34  sayo.net  阅读(1674)  评论(0编辑  收藏  举报