티스토리 뷰

How to Video Recording in Android?

English ver. is located in lower!

 

안녕하세요 박스여우입니다.

이번에는 안드로이드에서 카메라를 이용해 비디오를 촬영하는 방법에 대해 알아보겠습니다.

안드로이드에서 비디오를 촬영하는 방법은 여러가지가 있지만, 저는 그중에서 가장 대표적인 MediaRecorder를 다뤄보겠습니다.

 

먼저, 프로젝트를 생성하고, Manifast에 들어가서 아래 퍼미션들을 추가해 줍시다.

1
2
3
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
cs
 

permission CAMERA는 Camera에 접근하기 위한 퍼미션 이고, permission RECORD_AUDIO 는 마이크를 통한 오디오 녹음 권한을 얻기위해 추가하는 것입니다. 그리고 permission WRITE_EXTERNAL_STORAGE 는 스마트폰의 저장공간에 쓰기 권한을 얻는 퍼미션 입니다.

 퍼미션 등록이 완료되었으면 MainActivity에 가서 Camera와 MediaRecorder를 생성해 줍시다.


1
2
3
private Camera cam;
private MediaRecorder mediaRecorder;
 
cs

그리고 main 레이아웃에 동영상 촬영을 실행시키는 버튼과 카메라의 프리뷰를 위한 surfaceview를 생성합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Capture"
    android:id="@+id/button"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true" />
 
<SurfaceView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/surfaceView"
    android:layout_below="@+id/button"
    android:layout_alignParentStart="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true" />
cs

 

 

만들어진 버튼과 surfaceview를 사용하기 위해 클래스 영역에 아래 코드를 추가하고

 

1
2
3
private Button start;
private SurfaceView sv;
private SurfaceHolder sh;
cs

onCreate메소드 안에도 아래 코드를 추가합니다.


1
start = (Button)findViewById(R.id.button);
cs

 

그리고 카메라 사용과 프리뷰 등록을 위한 메소드 setting을 아래코드와 같이 만들어 줍시다

 

1
2
3
4
5
6
7
8
private void setting(){
    cam = Camera.open();
    cam.setDisplayOrientation(90);
    sv = (SurfaceView)findViewById(R.id.surfaceView);
    sh = sv.getHolder();
    sh.addCallback(this);
    sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
cs

 

여기서 cam.setDisplayOrientation(90); 코드를 사용해서 카메라를 90도 회전시켜주는 이유는 카메라를 회전시켜주지 않으면 카메라가 가로로 돌아간 상태로 동작됩니다.

 

surfaceview의 콜백 설정을 위해 해당 클래스에 SurfaceHolder.Callback 을 implements 해 줍니다. 그리고 아래 매소드 들을 클래스에 추가해 줍시다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
public void surfaceCreated(SurfaceHolder holder) {
    try {
        if (cam == null) {
            cam.setPreviewDisplay(holder);
            cam.startPreview();
        }
    } catch (IOException e) {
    }
}
 
 
public void surfaceChanged(SurfaceHolder holder, int formatint w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.
    refreshCamera(cam);
}
public void refreshCamera(Camera camera) {
    if (sh.getSurface() == null) {
        // preview surface does not exist
        return;
    }
    // stop preview before making changes
    try {
        cam.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }
    // set preview size and make any resize, rotate or
    // reformatting changes here
    // start preview with new settings
    setCamera(camera);
    try {
        cam.setPreviewDisplay(sh);
        cam.startPreview();
    } catch (Exception e) {
    }
}
 
public void setCamera(Camera camera) {
    //method to set a camera instance
    cam = camera;
}
 
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    // mCamera.release();
 
}
cs
 
버튼을 누를시 작동되는 기능을 넣기 위해 OnClickListener에 새롭게 만들 Listener를 넣어주고, 위에서 만든 setting() 메소드를 호출하는 코드를 onCreate 메소드에 추가해 줍시다.
 
1
2
start.setOnClickListener(captrureListener);
setting();
cs


리스너를 제대로 등록하기 위해 리스너를 만들어 줍시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
boolean recording = false;
View.OnClickListener captrureListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (recording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            cam.lock();
            recording = false;
        } else {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this"succeed", Toast.LENGTH_LONG).show();
                    try {
                        mediaRecorder = new MediaRecorder();
                        cam.unlock();
                        mediaRecorder.setCamera(cam);
                        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                        mediaRecorder.setAudioEncoder(3);
                        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
                        mediaRecorder.setOrientationHint(90);
                        mediaRecorder.setOutputFile("/sdcard/boxfox.mp4");
                        mediaRecorder.setPreviewDisplay(sh.getSurface());
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                        recording = true;
                        Toast.makeText(MainActivity.this"start", Toast.LENGTH_LONG).show();
                    } catch (final Exception ex) {
                        ex.printStackTrace();
                        mediaRecorder.release();
                        return;
 
                        // Log.i("---","Exception in thread");
                    }
                }
            });
        }
    }
};
cs

 

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

MediaRecorder를 통해 영상촬영을 할 때 오디오 녹음에 사용되는 방법을 설정하는 코드 입니다. 오디오 녹음에 대한 방법은 Default, MIC 등 여러가지가 있지만 저는 camcorder에서 지원해 주는 오디오 녹음을 사용하도록 하겠습니다.

 
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
이 코드도 마찬가지로 비디오 촬영에 대한 방법을 설정하는 코드 입니다.
 
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
이 부분에서는 촬영된 파일을 어떤 형태의 포멧으로 출력할 것인지 결정합니다. 여기서 지원해 주는 포멧은 MPEG2 TS나 THREE_GAP등이 있습니다.

 

mediaRecorder.setAudioEncoder(3);

mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

이 코드들은 영상의 인코딩 방식을 선택하는 코드입니다.

 

mediaRecorder.setOutputFile("/sdcard/boxfox.mp4");

이 부분에서 저장할 디렉토리와 파일명, 형식등을 지정해 줄 수 있습니다.



모든 작업이 다 끝났습니다!

 

 

 

How to Record Videos in Android?

English Ver.

 

Hi! I'm BoxFox!

This time I will talk to you about "How to Record Videos in Android"

Android has many ways for Recording Videos, but I use the MediaRecorder, one of most famous ways.

First, make a new project and write this following permissions in manifest

 

1
2
3
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
cs

 

Add permission CAMERA for access the camera.

Add permission RECORD_AUDIO is to get permission for using the mike and record audio.

Finally, add permission WRITE_EXTERNAL_STORAGE is to get writing permission in smart phone storage

 

If you finish add permissions,  add Camera and MediaRecorder in MainActivty.java

1
2
3
private Camera cam;
private MediaRecorder mediaRecorder;
 
cs

 

 

Next, create button to start video recording and create surfaceview for camera preview in main layout.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Capture"
    android:id="@+id/button"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true" />
 
<SurfaceView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/surfaceView"
    android:layout_below="@+id/button"
    android:layout_alignParentStart="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true" />
cs

 

 

Add the this codes in class area for using the button and surfaceview

 

1
2
3
private Button start;
private SurfaceView sv;
private SurfaceHolder sh;
cs

And add this codes in 'onCreate' method

 

1
start = (Button)findViewById(R.id.button);
cs

 

Write the 'setting' method code down to use camera and preview.

The codes are as follows.

 

 

1
2
3
4
5
6
7
8
private void setting(){
    cam = Camera.open();
    cam.setDisplayOrientation(90);
    sv = (SurfaceView)findViewById(R.id.surfaceView);
    sh = sv.getHolder();
    sh.addCallback(this);
    sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
cs

cam.setDisplayOrientation(90); : rotate camera 90 degrees by using this code. because, basic camera's preview is not normal. So, I rotate camera 90 degress for solve the problem  

add implements SurfaceHolder. Callback to class for surfaceview's call back and add this methods in class

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
public void surfaceCreated(SurfaceHolder holder) {
    try {
        if (cam == null) {
            cam.setPreviewDisplay(holder);
            cam.startPreview();
        }
    } catch (IOException e) {
    }
}
 
 
public void surfaceChanged(SurfaceHolder holder, int formatint w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.
    refreshCamera(cam);
}
public void refreshCamera(Camera camera) {
    if (sh.getSurface() == null) {
        // preview surface does not exist
        return;
    }
    // stop preview before making changes
    try {
        cam.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }
    // set preview size and make any resize, rotate or
    // reformatting changes here
    // start preview with new settings
    setCamera(camera);
    try {
        cam.setPreviewDisplay(sh);
        cam.startPreview();
    } catch (Exception e) {
    }
}
 
public void setCamera(Camera camera) {
    //method to set a camera instance
    cam = camera;
}
 
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    // mCamera.release();
 
}
cs

 

  

Add OnClickListener to action when you push the button. And add the code to call Created above 'setting' method in onCreate method


1
2
start.setOnClickListener(captrureListener);
setting();
cs

 

Next, Create new Listener for Enrollment Listener to button

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
boolean recording = false;
View.OnClickListener captrureListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (recording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            cam.lock();
            recording = false;
        } else {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this"succeed", Toast.LENGTH_LONG).show();
                    try {
                        mediaRecorder = new MediaRecorder();
                        cam.unlock();
                        mediaRecorder.setCamera(cam);
                        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                        mediaRecorder.setAudioEncoder(3);
                        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
                        mediaRecorder.setOrientationHint(90);
                        mediaRecorder.setOutputFile("/sdcard/boxfox.mp4");
                        mediaRecorder.setPreviewDisplay(sh.getSurface());
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                        recording = true;
                        Toast.makeText(MainActivity.this"start", Toast.LENGTH_LONG).show();
                    } catch (final Exception ex) {
                        ex.printStackTrace();
                        mediaRecorder.release();
                        return;
 
                        // Log.i("---","Exception in thread");
                    }
                }
            });
        }
    }
};
cs

 

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

When you record video use MediaRecorder, this code is set how to Audio Record. There are several ways for audio recording. MIC , tests etc. I choose the camcorder

 

mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
This code is like audio record setting. This code is set how to video record 
 
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

This part select record video format. Android support variety. MPEG2 TS, THREE_GAP etc.

 

mediaRecorder.setAudioEncoder(3);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

This codes is choose video encode type

 

mediaRecorder.setOutputFile("/sdcard/boxfox.mp4");

In this part, you can set directory, filename and type

 

 


Job has all done!

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함