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

MediaRecorder 를 이용한 카메라영상저장시 오류가 생기는데 원인을 모르겠습니다.

0 추천
Camera mCamera = Camera.open();
    MediaRecorder mMediaRecorder = new MediaRecorder();
 
    Button start;
    Button end;
    boolean isRecording = false;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        start = (Button) findViewById(R.id.button1);
        end = (Button) findViewById(R.id.button2);
 
        start.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    File file = Environment.getExternalStorageDirectory();
                    String path = file.getAbsolutePath() + "/test.mp4";
 
                    /*
                    OutputStream out = null;
                    try {
                        out = new BufferedOutputStream(new FileOutputStream(file));
                    } finally {
                        if (out != null) {
                            out.close();
                        }
                    }
                    FileDescriptor fd = new FileDescriptor();
                    fd.
                    */
                     
 
                    mMediaRecorder.setCamera(mCamera);
                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                    mMediaRecorder.setVideoFrameRate(5);
                    mMediaRecorder.setVideoSize(320, 240);
                    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                    mMediaRecorder.setOutputFile(path);
                    mMediaRecorder.prepare();
                    mMediaRecorder.start();
 
                    isRecording = true;
                    Toast.makeText(getApplicationContext(), "녹화를 시작합니다.",
                            Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "녹화를 시작할수없습니다.",
                            Toast.LENGTH_LONG).show();
                }
            }
        });
        end.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (isRecording) {
                    Toast.makeText(getApplicationContext(), "녹화가 종료되었습니다.",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "녹화가 진행되지않았습니다.",
                            Toast.LENGTH_LONG).show();
                    return;
                }
                mMediaRecorder.release();
 
            }
        });
 
    }

제가 사용한 셈플소스입니다. 영상을 보여주는 뷰는 설정하지 않았구요

에러 로그는 다음과 같습니다.

 

01-15 15:13:19.282: V/MediaRecorder(5255): setCamera(0x7667cd30,0x784a03c8)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setVideoSource(1)
01-15 15:13:19.282: V/MediaRecorder(5255): setVideoSource(1)
01-15 15:13:19.282: V/MediaRecorder(5255): Call init() since the media recorder is not initialized yet
01-15 15:13:19.282: V/MediaRecorder(5255): init
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setOutputFormat(2)
01-15 15:13:19.282: V/MediaRecorder(5255): setOutputFormat(2)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setVideoFrameRate(5)
01-15 15:13:19.282: V/MediaRecorder(5255): setVideoFrameRate(5)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setVideoSize(320, 240)
01-15 15:13:19.282: V/MediaRecorder(5255): setVideoSize(320, 240)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setVideoEncoder(2)
01-15 15:13:19.282: V/MediaRecorder(5255): setVideoEncoder(2)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): setOutputFile
01-15 15:13:19.282: V/MediaRecorder(5255): setOutputFile(58, 0, 0)
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): prepare
01-15 15:13:19.282: V/MediaRecorder(5255): prepare
01-15 15:13:19.282: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.282: V/MediaRecorderJNI(5255): start
01-15 15:13:19.282: V/MediaRecorder(5255): start
01-15 15:13:19.282: I/ViewRootImpl(5255): ViewRoot's Touch Event : Touch UP
01-15 15:13:19.352: E/MediaRecorder(5255): start failed: -19
01-15 15:13:19.352: V/MediaRecorderJNI(5255): process_media_recorder_call
01-15 15:13:19.352: W/System.err(5255): java.lang.RuntimeException: start failed.
01-15 15:13:19.352: W/System.err(5255): at android.media.MediaRecorder.native_start(Native Method)
01-15 15:13:19.352: W/System.err(5255): at android.media.MediaRecorder.start(MediaRecorder.java:758)
01-15 15:13:19.352: W/System.err(5255): at com.example.mediasendstream.MainActivity$1.onClick(MainActivity.java:66)
01-15 15:13:19.352: W/System.err(5255): at android.view.View.performClick(View.java:4442)
01-15 15:13:19.352: W/System.err(5255): at android.view.View$PerformClick.run(View.java:18473)
01-15 15:13:19.352: W/System.err(5255): at android.os.Handler.handleCallback(Handler.java:733)
01-15 15:13:19.352: W/System.err(5255): at android.os.Handler.dispatchMessage(Handler.java:95)
01-15 15:13:19.352: W/System.err(5255): at android.os.Looper.loop(Looper.java:136)
01-15 15:13:19.352: W/System.err(5255): at android.app.ActivityThread.main(ActivityThread.java:5118)
01-15 15:13:19.352: W/System.err(5255): at java.lang.reflect.Method.invokeNative(Native Method)
01-15 15:13:19.352: W/System.err(5255): at java.lang.reflect.Method.invoke(Method.java:515)
01-15 15:13:19.352: W/System.err(5255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
01-15 15:13:19.352: W/System.err(5255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
01-15 15:13:19.352: W/System.err(5255): at dalvik.system.NativeStart.main(Native Method)
 
 
에러 원인에 대해서 전혀 감이 잡히질 않습니다.
 
허슬러 (140 포인트) 님이 2015년 1월 15일 질문

1개의 답변

0 추천

예제를 들고 오셨으니 소스상은 오류가 없을 듯 한데, 오류가 났나보군요..

start failed: -19 라는 로그가 보이는데 19는 errno.h 파일에 정의된  ENODEV 라 보시면 됩니다.

즉 카메라 핸들을 생성하는데 실패 했다는 로그로 여러 이유가 있겠지만, 카메라에서 지원하지 못하는 파라메터가 입력되서 

오류가 반환된게 아닐까 합니다.

mMediaRecorder.setVideoFrameRate(5);
mMediaRecorder.setVideoSize(320, 240); 부분을 주석하던지 다른 값을 넣어 보세요
 
그리고  Camera를 open 했음 사용이 끝나면 반드시 close 해 주셔야 재 이용 가능한데,  첨부해 주신 소스에는 close 하시는 부분이 안보이며, 카메라의 메소드 중 setPreviewDisplay, startPreview 같은 것도 호출이 안된 듯 합니다.
아래 코드를 확인 해서 수정 해 보세요
 
 
 
사악미소 (65,330 포인트) 님이 2015년 1월 15일 답변
사악미소님이 2015년 1월 15일 수정
빠른답변 친절한 멘트에 감사드립니다.
말씀주신데로 해당링크를 참고로 다시한번 도전해 봐야겠네요^^
고맙습니다.
...