제임스딘딘의
Tech & Life

개발자의 기록 노트/Android

[안드로이드] 안드로이드 SDK 에뮬레이터에서 웹캠영상 받기

제임스-딘딘 2011. 2. 3. 01:55

안드로이드 SDK 에뮬레이터에서 웹캠영상 받기

안드로이드 의 에뮬에서는 직접적인 카메라 지원은 하지 않는다.
그래서 PC의 웹캠을 달고 영상을 에뮬에 전달해서 보여주는 방식을 사용하는데,
이걸 하는 방법은 다음과 같다.



카메라 영상을 Broadcasting하는 서버

일단은 android 개발 환경과 SDK는 다 설치 되었다는 가정하에 시작하자.


먼저 JMF가 필요한다.. 자바 에서 웹캠을 동작시켜 주는 프로그램이다.
현재는 거의 망해서 지원이 미비 하지만.. 어쨌건 우리는 이걸 사용해야 한다.

JMF는 여기서 받는다.

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html

받아서 설치 하고 난다음에
환경변수에서 classpath가 제대로 설정되어 있는지 확인 한다.


C:\Program Files\JMF2.1.1e\lib;C:\Program Files\Java\jdk1.6.0_21\lib;

위의 내용을 classpath에서 확인..

JMF 설치가 끝났으면, 캠영상을 보내는 역할로써 server가 필요한데, 이걸 구현해 놓은 사이트가 있다.


http://www.tomgibara.com/android/camera-source


여기 들어가서  CameraSource, SocketCamera, WebcamBroadcaster 소스를 받는다.
server 역할을 하는 소스는 WebcamBroadcaster이다.

이걸 프롬프트상에서 다음과 같이 실행하면 웹캠 동작 상태가 된다(웹캠이 동작한다는 표시가 들어옴.)

여기까지 했다면, webcam의 영상을 서버가 broadcasting 하고 있는것이다.


카메라 영상 수신 및 보여주는 클라이언트


이제 이 영상을 받아서 뿌려주는 부분을 구현 하면 되는데,
위에 받았던 CameraSource와 SocketCamera 소스를 이용한다.

CameraSource는 그대로 사용하고
SocketCamera 소스는 Line 77,78  에서 bitmap.getWidth(), bitmap.getHeight() 으로 수정해준다.

파일은 총 4개로 구성되어 있는데 다음과 같다.
1. CameraSource.java
2. Preview.java
3. SocketCamera.java
4. webcamactivity.java


Preview 소스는 다음과 같다.

preview.java 소스를 보면 웹캠 서버의 아이피 주소를 넣게 되어 있는데 
사용하는 본인 컴퓨터의 IP를 넣으면 된다.

SocketCamera cs= new SocketCamera("XXX.XXX.XXX.95", 9889, 320, 240,true); // XXX 부분에 본인 IP 넣도록 한다.

kage com.test.WebCam;

import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class Preview extends SurfaceView implements SurfaceHolder.Callback, Runnable{
    private Thread thread = null; 
    SurfaceHolder mHolder;
    webcamactivity mCamera;
    Canvas canvas;
    SocketCamera cs= new SocketCamera("XXX.XXX.XXX.95", 9889, 320, 240,true);

    public Preview(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
    }

    public void run(){ 
        while (true) { 
            Canvas c = null; 
            try {
                c = mHolder.lockCanvas(null); 
                synchronized (mHolder){ 
                    cs.capture(c);
                    Thread.sleep(0);
                }//sync
            } catch (InterruptedException e){
                e.printStackTrace();
            } finally { 
                if (c != null) {
                    mHolder.unlockCanvasAndPost(c);
                } 
            }
        }//while() 
    }//run(){} 

public void surfaceCreated(SurfaceHolder holder) 
{          
    thread = new Thread(this); 
    thread.start(); 
}


public void surfaceDestroyed(SurfaceHolder holder)
{
    thread.stop();
}


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{ 
    thread.stop();
}



webcamactivity 소스는 다음과 같다.


package com.test.WebCam;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class webcamactivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
           super.onCreate(savedInstanceState);
           requestWindowFeature(Window.FEATURE_NO_TITLE);
           setContentView(new Preview(this));
    }

}