마스터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일 수정
빠른답변 친절한 멘트에 감사드립니다.
말씀주신데로 해당링크를 참고로 다시한번 도전해 봐야겠네요^^
고맙습니다.
...