반응형
출처 : http://211.234.117.89/board/board.php?board=AndroidTechQnA&page=152&sort=hit&command=body&no=3522

MediaRecorder에 setCamera()로 카메라 객체를 할당해서 녹화를 하려고 하는데, 계속 에러가 발생하네요.
Camera를 쓰지 않고 그냥 MediaRecorder의 start()로 하면 녹화가 잘 되는데
미리보기 크기 조절이 필요해서 Camera를 할당해서 코드를 작성한 뒤로는 녹화가 안됩니다.
 
에러로그와 소스코드를 첨부합니다.
 
 
도와주시면 감사하겠습니다!
 
 
 
로그캣 에러로그입니다.
 
07-22 15:04:39.867: ERROR/AndroidRuntime(3787): java.lang.IllegalStateException
07-22 15:04:39.867: ERROR/AndroidRuntime(3787):     at android.media.MediaRecorder.start(Native Method)
07-22 15:04:39.867: ERROR/AndroidRuntime(3787):     at kr.pe.spinell.ntest00.Recorder.startRecording(Recorder.java:113)
07-22 15:04:39.867: ERROR/AndroidRuntime(3787):     at kr.pe.spinell.ntest00.Main$RecorderController.run(Main.java:91)

 
 
소스코드입니다.
 
 
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaRecorder;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Recorder extends SurfaceView implements SurfaceHolder.Callback {
 
 MediaRecorder mediaRecorder = null; // 레코더
 SurfaceHolder surfaceHolder = null; // 미리보기
 Camera   camera = null;   // 카메라
 
 String  strRecPath = null; // 저장위치
 String  strRecFile = null; // 파일명
 
 boolean  bRecCheck = false; // 녹화여부 확인
 // 생성자
 // MediaRecorder 데이터 할당은 순서대로 해야 함
 public Recorder(Context context) {
  super(context);
   
  surfaceHolder = getHolder();
  surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  surfaceHolder.addCallback(this);
    
  
  mediaRecorder = new MediaRecorder();
  
  camera = Camera.open();    // 카메라 객체 할당
  mediaRecorder.setCamera(camera); // 레코더의 녹화용 카메라 설정
  
  strRecPath = "/sdcard/"; // 저장위치 설정
  strRecFile = "test.3gp"; // 파일이름 설정
  
  
  // 미디어 레코더 소스 설정(마이크, 카메라)
  mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
  mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  
  // 포맷 설정
  mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
  strRecFile = strRecPath + "/" + strRecFile;
  mediaRecorder.setOutputFile(strRecFile);  
  
  // 미디어 레코더 인코딩 설정(기본)
  mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
  
  // 비디오 옵션 설정
  mediaRecorder.setVideoFrameRate(15);
  mediaRecorder.setVideoSize(320, 240);
    
  if(mediaRecorder != null) {
   try {
    mediaRecorder.prepare();
   } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }   
  }
 }
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
    
//  mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 미리보기 설정
  try {
   camera.setPreviewDisplay(surfaceHolder);
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  
  
  
 }
 
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  Parameters parameters = camera.getParameters();
//  Size size = parameters.getSupportedPreviewSizes().get(0);
//  parameters.setPreviewSize(size.height, size.width);
  parameters.setPreviewSize(160, 120);
  camera.setParameters(parameters);
  
  camera.startPreview();
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  camera.stopPreview();
  camera.release();
  camera = null;
 }
 
 
 public MediaRecorder getRecorder() {
  return mediaRecorder;
 }
 
 public void setRecorder(MediaRecorder mediaRecorder) {
  this.mediaRecorder = mediaRecorder;
 }
 
 // 녹화 시작
 public void startRecording() {
  mediaRecorder.start();  
  bRecCheck = true;
 }
 
 // 녹화 종료
 public void stopRecording() {
  mediaRecorder.stop();
  mediaRecorder.reset();
  mediaRecorder.release();
  bRecCheck = false;
 }
}
반응형

'Android' 카테고리의 다른 글

Custom VideoView 작성하기  (0) 2011.02.09
빌드한 환경에서 Android Emulator 실행  (0) 2011.02.09
안드로이드 Manager 종류  (0) 2011.01.28
Posted by Real_G