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

동영상 촬영/저장 연속으로 하기...

0 추천

아래와같은 코드로하면

클릭시 surfaceview로 동영상이 나오면서

다시 클릭하면 특정한 폴더에 영상 저장이됩니다.

그런데 제가 원하는건 한번더 클릭하면 새로운 영상이 찍히는것인데요..

mediarecorder.start()부분에서 에러가 나면서안됩니다...

catch문에서 로그찍힌거보면 java.lang.RuntimeException: start failed. 이거네요 ㅜㅠ

 

뭘까요...

전체코드는 아래와같습니다. (8000자 제한때문에 오버라이드 하는부분이나...permission부분 생략했습니다.)

진짜 전체코드는 지식인 링크

 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040104&docId=271467218

 

참고부탁드립니다.(그대로 복붙해도 작동할겁니다.)

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
  
   private MediaRecorder mMediaRecorder;
   private Camera mCamera;
   private SurfaceView mSurfaceView;
   private SurfaceHolder mHolder;
   private View mToggleButton;
   private boolean mInitSuccesful;
   private boolean is_recording;
   private SurfaceHolder.Callback context;
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      context=this;
      checkPermission();//checkpermission 부분 생략합니다. 글자수제한;;
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

      mSurfaceView = (SurfaceView) findViewById(R.id.preview);
      mHolder = mSurfaceView.getHolder();
      mHolder.addCallback(this);
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

      mToggleButton = (ToggleButton) findViewById(R.id.toggleRecordingButton);
      mToggleButton.setOnClickListener(new View.OnClickListener() {
         @Override
         // toggle video recording
         public void onClick(View v) {

            if(is_recording){

               Log.e("error","중지클릭됨");
               mMediaRecorder.reset();
               mMediaRecorder.release();
               mMediaRecorder=null;

               is_recording=false;
            } else {
               Log.e("error","눌림");


               //일단 initRecorder 이후에 start가 이뤄져야함.
               if (mMediaRecorder == null) {
                  Log.e("error","null");
                  mMediaRecorder = new MediaRecorder();
               }
               try {
                  initRecorder(mHolder.getSurface());
               } catch (IOException e) {
                  e.printStackTrace();
               }
               try {
                  mMediaRecorder.prepare();
               } catch (IllegalStateException e) {
                  e.printStackTrace();
               } catch (IOException e) {
                  e.printStackTrace();
               }
               try {
                  mMediaRecorder.start();
               } catch (Throwable e) {
                  e.printStackTrace();
                  Log.e("error", "errrrr"+e+"");
               }

               is_recording=true;
            }
         }
      });
   }
   private static File getOutputMediaFile() {
      File mediaStorageDir = new File(
            Environment
                  .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp");
      if (!mediaStorageDir.exists()) {
         if (!mediaStorageDir.mkdirs()) {
            Log.d("MyCameraApp", "failed to create directory");
            return null;
         }
      }
      // Create a media file name
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
            .format(new Date());
      File mediaFile;
      mediaFile = new File(mediaStorageDir.getPath() + File.separator
            + "IMG_" + timeStamp + ".jpg");
      Log.e("error",mediaStorageDir.getPath());
      return mediaFile;
   }

   private void initRecorder(Surface surface) throws IOException {

      if (mCamera == null) {
         mCamera = Camera.open();

         mCamera.unlock();
      }
//    mCamera.setDisplayOrientation(90);

      mMediaRecorder.setPreviewDisplay(surface);
      mMediaRecorder.setCamera(mCamera);

      mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

      //       mMediaRecorder.setOutputFormat(8);
      //mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
      mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

      mMediaRecorder.setVideoFrameRate(30);

      //mMediaRecorder.setVideoSize(640, 480);
      File mediaStorageDir = new File(
            Environment
                  .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp");



      mMediaRecorder.setOutputFile(mediaStorageDir.getPath()+"/kkkhh.mp4");

   }

}
익명사용자 님이 2017년 2월 24일 질문
이런 류는 차라리 github 에 프로젝트를 통으로 올리거나 예제 프로젝트 하나 만들어서 올리면 테스트하기 더 편합니다. 그리고 로그가 있다면 질문할 때 로그도 같이 올리시고요.
카메라를 한번 open해서 계속 쓰는 것이나 surface쪽 문제일 것으로 생각됩니다. . 카메라를 release 후 다시 open하는 방식으로 바꿔 보시는게 좋을 듯 합니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...