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

videoview사용해서 동영상 촬영하는 코드를 짜봤는데 동영상이 저장이 안되네요 ㅠ

0 추천
package com.example.administrator.videotest;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.widget.VideoView;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    static Context ctx;
    //String Path = "/sdcard/cameratest.mp4";
    String Path = Environment.getExternalStorageDirectory() + "/txtbox/cameratest.mp4";
    private MediaRecorder mRecoder = null;
    private VideoView mVideoView = null;
    private Camera mCamera;
    private static final int RECORD_TIME = 10000; //5min 300000

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera = Camera.open(); //객체생성
            mCamera.setDisplayOrientation(90);
            mCamera.setPreviewDisplay(holder); //프리뷰 디스플레이 담당한 서피스 홀더 설정
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if (mCamera != null) {
            mCamera.startPreview();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
            mCamera.stopPreview(); //프리뷰 멈춤
            mCamera = null; //카메라 객체 초기화
        }
    }

    private void beginRecording(SurfaceHolder holder) {
        //레코더 객체 초기화
        if (mRecoder != null) {
            mRecoder.stop();
            mRecoder.release();
            mRecoder = null;
        }

        //파일 생성, 초기화
        File videofile = new File(Path);
        if (videofile.exists()) {
            videofile.delete();
        }
        if (mCamera != null) {
            mCamera.stopPreview(); //프리뷰 멈춤
            mCamera.release();
            mCamera = null; //카메라 객체 초기화
        }

        try {
            mRecoder = new MediaRecorder();
            //video, audio 소스 결정
            mRecoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
            //mpeg4로 인코딩 시 음성 영상 모두 녹화.
            mRecoder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            //mRecoder.setVideoSize(1280, 720);
            mRecoder.setVideoFrameRate(25);
            mRecoder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            //녹화시간
            mRecoder.setMaxDuration(RECORD_TIME);
            //프리뷰 보여 줄 surface 설정
            mRecoder.setPreviewDisplay(holder.getSurface());
            //녹화할 대상 파일 설정
            mRecoder.setOutputFile(Path);
            mRecoder.prepare();
            mRecoder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //화면 고정
        //SCREEN_ORIENTATION_LANDSCAPE 가로 / SCREEN_ORIENTATION_PORTRAIT 세로
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        mVideoView = (VideoView) findViewById(R.id.videoView); //레이아웃의 videoView멤버 변수에 매핑
        final SurfaceHolder mHolder = mVideoView.getHolder(); //videoView로부터 인스턴스 얻어옴.
        mHolder.addCallback(this); //표면 변화를 통지받을 콜백 객체 등록
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //버퍼 없이 화면 표시
        beginRecording(mVideoView.getHolder());
    }
}

 

버튼같은 것 없이 앱실행되자 마자 5분 촬영하고 저장해주고 싶은데, 여기까지는 아직 잘 모르겠구요ㅠ

onCreate되고 셋팅다 해준다음에 beginRecording함수로 녹화 시작하고 파일을 저장합니다.

확인 해 보면 파일 저장된 것 까지는 확인이 되는데 동영상 파일이 아무 내용도 없고, 0.00B로 뜨네요 .. 클릭하면 지원하지 않는 파일 형식이라고 뜨는데..

학생이라 인터넷 글 보면서 이것저것 짜집기 한 코드라 형편 없지만, 어디가 잘못된 건지 혹시 아시겠으면 도움 좀 주세요ㅠㅠ

sksk (320 포인트) 님이 2016년 7월 16일 질문

1개의 답변

0 추천
정정합니다.

카메라 객체를 MediaRecorder에 넘겨 주셔야 해서

레코딩 종료 전에 카메라를 release하거나 stopPreview를 호출하시면 안됩니다.

mCamera.unlock();// 카메라를 MediaRecorder에서 access하기 위해서 호출해 주셔야 합니다.
mRecoder.setCamera(mCamera);

를 mRecoder.prepare(); 이전에 호출 하고
레코딩이 끝난 이후에 release 하는 씩으로 변경하셔야 합니다.
익명사용자 님이 2016년 7월 18일 답변
2016년 7월 18일 수정
일단 답변 너무 감사합니다..
흠... 카메라가 사용중인 거라 lock이 된 상태인건가요? unlock쓰니까 오류가 뜨네요 ㅠ
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.unlock()' on a null object reference
...