Tistory View

Android Develop/camera

카메라 api 주의사항

God Dangchy What should I do? 2017. 10. 25. 17:54

안드로이드 장치에 장착된 카메라를 이용하는 프로그램을 연습 중이다.

솔직히 필자의 경우 카메라를 사용할 일이 없어서 무심히 지나치던 부분인데, 일반 사용자들이 이렇게도 카메라를 이용하여 촬영을 많이 할 줄은 몰랐다.

그래서 관심을 가지고 구글의 API문서를 정독을 시작했다.


https://developer.android.com/guide/topics/media/camera.html  : 킷캣까지.. 구글이 제공하는 일반적인 카메라 사용법

https://developer.android.com/reference/android/hardware/Camera.html : 킷캣까지의 class



처음 위의 두 페이지에 들어가면 가장 눈에 띄는 것이 바로 이 문서들은 롤리팝부터는 Deprecated되었다는 것이다.

글을 쓰고 있는 현재, 아직도 많은 장치들이 롤리팝이하 버전도 적지 않을 텐데, 상대적으로 너무 높은 버전에서 새로운 API가 추가된 것 같다.


새로운 Api는 다음의 링크이다.

https://developer.android.com/reference/android/hardware/camera2/package-summary.html


필자가 고민에 빠진 것은, 기기의 마다 구분하여 동작하는 api를 만들지 그냥 구버전의 것 만을 이용할 지 였다.

결론적으로 기기별로 구분하여 동작되도록 만드 것이 마지막이겠지만, 카메라가 가진 기능이 일일이 프로그램을 짜서 테스트하기에는 너무 많다는 것이 문제였다.


딱 필요한 부분만을 사용하는 App을 만드는 것이 제일 좋다는 생각이 계속 머리속을 스치기도 한다.


우선 구버전의 api를 테스트한 결과이다.


1. 구글에서 제공하는 순서를 무조건 준수하라. 

위의 문서를 보면 사진 한장을 찍기위한 과정이 일일이 다 설명이 되어있고, 동영상 촬영또한 일일이 코드로 설명이 되어있다.

이토록 설명을 자세히하는 경우를 구글에서 솔직히 본적이 별로 없다( 이 친구들이 별일이네 하는 생각마저 들었다.. )

보통 구글에서 제공하는 문서만으로는 충분치 않아 구글신의 도움으로 샘플코드를 찾아보고, 검색을 하면 스택오버플로를 뒤져서 겨우 동작하는 코드를 만드는 것이 보통이었는 데.. 구글에서 이토록 상세한 문서를 제공하는 경우를 별로 보지 못했다.

솔직히 문서를 만드는 것은 아주 중요한 것이지만 독자들에서 정확한 설명을 일일이 하는 것은 시간이 너무 많이 드는 일이다.

특히 구글은 문서를 상세히 만들지는 않는다.(MSDN에 비해서)


2. 위의 문서를 보면 Preview창이 없으면 사진을 찍거나 동영상촬영이 안되는 것으로 표현 되어있다.

필자가 테스트를 해본 결과 Preview가 없는 경우에 동작하는 기기가 있었다. 하지만 거의 모든(?) 장치에서 동작을 시켜야하는 것이기에 어쩔 수 없이 Preview를 둘 수 밖에 없었다.

Preview를 꼭 넣어야 하는 문제로 화면UX구성이 참으로 까다로운 부분으로 남아버렸다.

다음의 링크에는 Preview를 굳이 화면에 넣지 않고(Preview를 만들기는 하지만 화면에는 없는) 카메라를 동작시키는 코드를 구할 수 있다.

(하지만 새로운 장치[특히 새로운 안드로이드버전]에서 동작이 안될 수 있다는 것을 알고 있어야 한다.)

https://stackoverflow.com/questions/2386025/taking-picture-from-camera-without-preview

참 사람들 놀라운게.. 별 희한한 방법을 동원해서 화면에 preview를 넣지 않으려 애쓰는 것이 보였다.

여기서 혹시, "그럼 프리뷰를 넣으면 되잖아요?"하는 질문이 생길 수 있는 데, 필자의 경우 OpenGLES를 이용하여 Texture를 만든 후 이 것을 화면에 보여주려는 의도였다. 이런 상황에서도 필요없는 Preview 넣어야 하는 문제가 발생한다.

(몰카 만드려는 의도로 카메라를 이용하는 상황이 아니라도, 이 문제는 상당히 자주 발생하는 부분이다.)


위의 링크였는지 기억은 잘 나지 않지만, transparent로 처리하는 방식을 쓰는 생각도 있다는 것이 살~짝~ 감탄하기도 했다.


3. Preview에서 제공하는 크기많을 사용하라.

Preview창을 만들 때 창의 크기는 상관 없지만(물론 찌그러지는 부분이 있다.), 카메라가 제공하는 Preview크기를 이용해야 한다.

분석에 들어간 이후, 적지않는 개발자들이 자기가 원하는 크기로 Camea에 명령을 내리는 부분이 있어, 이 글에 담아 둔다.

(올바르지 않은 샘플 코드를 쓰지말라는 뜻에서 넣어두었다.)

카메라마다 제공하는 Preview크기가 다르다. 기기에도 1~3개의 카메라있다. 이 1~3개의 카메라도 각각의 Preivew크기가 다르다.

( 안드로이드 기기에따라 Preview크기가 있는 것이 아니고, 카메라 마다 다르다. )

(솔직히 그냥 기본값으로 되어있는 것 쓰는 게 젤 속편했다. )



4. 촬영장면을 메모리로 받을 수 있는가? - (ㅠㅠ 아직 파악하지 못했다.. 설마 안드로이드 framework 소스 따야 될 일은 없기를 바란다..)

아직 테스트와 파악을 하지 못한 부분이 동영상을 촬영하려면 꼭 인코더[MediaEncoder]를 이용해야하는 데.. 

촬영장면을 memory로 땡기는 방법이 있는 지를 잘 모르겠다.

워낙 전송량과 처리부하가 걸리는 부분이라, 인코더와 직접연결하여 처리되는 방식으로 보여서 가능할지 의문이다.


5. Preview이미지를 RGB로 받을 수 있는 가? 미리 포기하라

NV21을 기본으로 제공하고 YV12(??)를 추가로 보통제공하는데.. 바로 RGB로 받는 방법은 없다. 그냥 없다.

기기가 지원해 준다고 해도 그 기기만 될 뿐 거의 모든 기기에서 되는 것이 아니다.

그냥 NV21를 사용하라. (단, 신 APi는 YV12를 사용할 것을 권장하고 있다. )

혹시 NV21을 사용할지 YV12를 사용할 지 고민이라면 필자의 경우 YV12를 사용할 것을 권한다. 하지만 NV21도 꼭 지원하는 것이 좋을 거다..

NV21 이따구 걸 왜 만들어서 짜증나게 하는 지 모르겠다.


NV21과 YV12의 규격은 따로 포스팅을 해야 될 것 같다.(찾기 귀찮다.. 워낙 찾는데 시간이 걸리는 부분이라..)


우선 주의사항을 이렇게 정리한다.

이게 완성되면 신버전의 Api를 이용하는 것으로도 만들어야 되는데... 구버젼이 언제 기기에서 없을질지는 모르겠고..... 혹시 이미 없을 졌을 라나....?

(기기내에 계속 있다면, 그냥 쓰면 되는 것이니....)



Replies
Reply Write