예제 소스 코드 : CameraExample
참고 문헌 : http://developer.android.com/guide/topics/media/camera.html
안드로이드 디벨로퍼 사이트 API Guide의 카메라 부분의 문서를 바탕으로 비디오 캡쳐 어플리케이션을 구현한 것입니다. (상단 링크 참조). 이 예제를 실행하면 버튼을 누르면 녹화가 시작되고 다시 누르면 녹화가 종료되는 아래 이미지와 같은 어플리케이션이 실행됩니다. 첨부한 소스코드를 보실 때 참고할 만한 내용만 설명하겠습니다. 자세한 설명은 위의 링크를 참조해주세요.
Project Overview
어플리케이션에 이용되는 소스 코드의 요약입니다. 안드로이드 디벨로퍼 사이트에서는 Activity 클래스 안에 여러 기능들을 함수로 구현하는 방식으로 설명하였는데, 이 예제에서는 소스코드를 기능별로 분류하여 각각의 클래스로 작성하였습니다.
activity_record.xml
- 어플리케이션의 UI를 담당하는 레이아웃 파일입니다. RelativeLayout을 통해 FrameLayout 과 녹화의 기능을 하는 버튼을 곂치도록 설정해 놓았습니다.
RecordActivity.java
- 액티비티 클래스 입니다. 카메라 기능을 수행해 주는 기능을 합니다.
CameraPreview.java
- 화면에 카메라의 프리뷰 영상을 띄워주는 클래스 입니다. 현재 카메라에 비치는 이미지를 화면에 출력해주는 역할을 합니다. RecordActivity 클래스에서 이용됩니다.
CameraManager.java
- 카메라의 상태를 관리해주는 클래스입니다.
MediaManager.java
- 미디어 레코더의 상태를 관리해주는 클래스입니다.
FileManager.java
- 파일 관리를 위한 클래스로 파일 경로를 설정해주는 기능을 합니다.
예제 코드 설명
각각의 클래스에서 이용되는 코드 중 몇몇 부분에 대한 설명입니다.
RecordActivity Class
onCreate 함수에서는 카메라 객체를 생성, 프리뷰 영상을 출력, 버튼 클릭시 효과를 지정해줍니다. 버튼을 클릭했을 때 녹화중이면 버튼이 정지 버튼으로 바뀌고, 녹화중이 아니면 카메라 모양의 버튼으로 바뀌게 설정해 놓았습니다.
prepareVideoRecorder 함수는 MediaRecorder 객체를 이용하여 화면 녹화를 준비하는 기능을 수행합니다. 주의해야할 부분은 디벨로퍼 사이트에서 카메라 객체에 getCameraInstance() 를통해 바로 카메라를 생성해 주도록 설명이 되어있는데, 이럴 경우 프리뷰 화면에서 카메라 객체를 이용하고 있는 상태에서 이 카메라를 닫지 않고 새로 생성해 주기 때문에 문제가 발생합니다. 따라서 이 예제에서는 카메라 객체를 새로 생성해주기 전에 현재 카메라를 닫아주었습니다. MediaRecorder 객체에 초당 프레임 수, 해상도 등을 설정해 주면 출력되는 동영상의 속성을 지정 할 수 있습니다.
CameraPreview Class
카메라 객체를 받아와서 화면에 SurfaceView 형식으로 영상을 출력해주는 기능을 합니다. 객체를 생성할 때 카메라 객체를 받아오고 SurfaceHolder 를 생성해줍니다. SurfaceView 가 생성될 때 화면에 프리뷰를 시작해줍니다.
CameraManager Class
static 함수들로 클래스를 구성해두었습니다. getCameraInstance 함수는 받은 카메라를 null 값으로 해주고 다시 카메라를 열어줍니다. Activity 클래스에서 이 함수만 실행시킬 경우 문제가 발생하는 이유가 카메라를 닫아주지않고 null 값을 새로 대입한 뒤 다시 열기 때문에 열려있는 상태인 camera가 두개가 되기 때문에 오류가 발생합니다. releaseCamera 함수는 카메라를 닫고 null을 대입해 주는 기능을 수행합니다.
MediaManager Class
마찬가지로 static 함수로 클래스가 구성되어있습니다. releaseMediaRecorder 함수는 MediaRecorder 를 초기화 해주고 카메라 객체를 닫아주는 역할을 하는 함수입니다.
FileManager Class
마찬가지로 static 함수로 구성되어있고, getOutputMediaFile 함수는 현재 날짜와 시간을 바탕으로 파일 이름을 생성해 주고, 녹화된 영상을 저장할 위치를 설정해줍니다. 저장 경로를 SDCARD/Downloads/MyCameraApp 으로 설정해 놓았습니다. 이부분을 바꾸면 원하는 경로로 영상이 저장됩니다.