마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

A핸드폰 카메라의 영상을 B핸드폰으로 보내 확인하려고 합니다.

0 추천
제목 그대로인 어플을 만들려고 합니다. 제가 선택한 사항은 홈 cctv인데요.

졸업프로젝트로 이 주제를 잡았습니다. 영상 전달이 어려운 부분인 것을 알고 도전해봤습니다.

하지만 지금 일주일째 정보를 찾고 있는데 공부할 방향을 못잡고 있습니다.

 

FTP서버로도 영상통화같은 영상 전달이 가능할까요? 약간 delay되도 상관없습니다.

RTSP 라는 방식을 사용하려면 OS가 서버용을 사용해야 가능하다고 해서 생각안하구 있구요.

저장은 안되도 상관없지만 영상을 실시간으로 볼수 있었으면 좋겟습니다.

어떤 기술을 사용해야 될까요? 핸드폰 카메라에서 보내주는 영상을 RGB형식으로 바꿔서 서버에 전달해야 된다고 들었습니다.

어떠한 방식으로 접근해야 가능할까요?

 

추가적으로 한가지더 궁금한것은

어플을 이용해 핸드폰을 서버로 만들었는데 컴퓨터를 거치지 않고 바로 핸드폰끼리도 구현 가능한 문제인가요?
carinjk (120 포인트) 님이 2014년 3월 26일 질문
보통 질문자 분과 같은 식으로 된 오픈 소스를 보면 안드로이드 단말기를 서버로 만들어도 하더군요. 아니면 캡쳐해서 일일이 넘겨주고 보는 쪽 단말기에서 넘어온걸 뿌려주는 식으로 해도 되겠구요. 영상을 몇초단위로 찍어서 보내고 받고 해도 되겠지만 이건 성능이 또 어떨지...^^;
그리고 RTSP 방식을 사용하여 스트리밍을 하려면 OS가 꼭 서버용이여야 하는게 아닙니다. 일반 윈도우 OS에서 다윈 스트리밍 서버, 와우자 스트리밍 서버 등을 설치하여도 스트리밍을 할 수 있는 것 처럼요.
단말기를 서버로 만들어서 할때의 문제점은 단말기가 거의 공인 IP를 가지지 않기 때문에 나타나는 문제입니다. 따라서 공인 IP를 설정해주거나 같은 내부 네트워크 망(같은 공유기에 물린 상태)에서는 문제가 없습니다. 실제로 오픈소스들도 같은 공유기 내에서는 잘 작동합니다.
비슷한 기능을 하는 오픈소스를 좀 더 찾아보시고 졸업 프로젝트 잘 마무리 하기를 바랍니다.
주절주절 말이 길었는데 도움이 되셨기를 바랍니다.

2개의 답변

+1 추천
핸드폰끼리도 구현 가능할 것 같구요.

 

http://stackoverflow.com/questions/1893072/getting-frames-from-video-image-in-android

 

프리뷰에서 바로 프레임을 받아와서 Bitmap 오브젝트로 만드는 것도 가능한 거 보니 그걸 하나하나 보내도 될 것 같구요.

 

android VNC 를 한번 검색해보세요. 제가 예전에 vnc 바이너리를 컴파일해서 그걸 이용해 블루투스 PAN 을 이용해서 한 기기에서 다른 기기로 화면을 보내는 프로젝트를 해본적이 있는데 옛날이라 가물가물 하네요. 그걸 네트워크 상으로 변환한다면 비슷하게 구현이 가능하지 않을까요.
AndroidDictator (1,660 포인트) 님이 2014년 3월 27일 답변
+1 추천
 
복잡하게 할 것도 없이 영상만 뿌려주고 sync를 맞출 필요가 없다면,
 간단한 socket 연결을 통해 A단말에서 영상 정보를 보내고 B 단말에서 받아 ImageView만 바꿔주시면 됩니다. 
           
// A 단말에서 카메라 정보 구하는 예제로 send 쪽은 직접 구현 해주셔야 합니다.        
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
 
    public void onPreviewFrame(byte[] data, Camera camera) {
        
                        int w = params.getPreviewSize().width;
 
                        int h = params.getPreviewSize().height;
 
                        int format = params.getPreviewFormat()
            
            send(w, h, format, data);
    }
}
 
 
// B단말에서 정보를 받았을 때의 예제입니다. 
private void updateImage(byte[] data, Camera.Parameters params , int w, int h)
{
    YuvImage image = new YuvImage(data, format, w, h, null);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    Rect area = new Rect(0, 0, w, h);
    image.compressToJpeg(area, 50, out);
    bitmap = captureImg = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());
 
    mImageView.setImageBitmap(bitmap);
}
단지 onPreviewFrame쪽의 경우 카메라 용이라 1초에 10fps 정도만 지원가능할겁니다.
 
다른 방법으로  http://developer.android.com/reference/android/media/MediaRecorder.html 의 C쪽 코드를 수정해서 파일로 떨궈지는 것을 http로 쏘게 하고 대상 단말에서 mediaplayer를 통해 재생하는 방식도 좋긴 한데,  C쪽 코드는 제조사마다 조금씩 달라질 수 있어서, 단말특성을 탈 수 있습니다. 그래도 졸작이니. 대상 단말을 정해서 시도해보시는 것도 괜찮을 듯 하네요.
사악미소 (65,330 포인트) 님이 2014년 3월 27일 답변
...