package com.example.administrator.ttttest;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.CountDownTimer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
static Context ctx;
String Path= Environment.getExternalStorageDirectory()+"/videotest.mp4";
private MediaRecorder mRecoder = null;
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private Camera mCamera;
//private static final int RECORD_TIME = 5000; //5min 300000
String TAG;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //화면 세로고정
mPreview = (SurfaceView)findViewById(R.id.surfaceView);
mHolder = mPreview.getHolder(); //videoView로부터 인스턴스 얻어옴.
mHolder.addCallback(this); //표면 변화를 통지받을 콜백 객체 등록
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //버퍼 없이 화면 표시
Toast.makeText(getApplicationContext(), "call Video record", Toast.LENGTH_SHORT).show();
beginRecording();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try{
mCamera = Camera.open(); //객체생성
Camera.Parameters parameters = mCamera.getParameters(); //객체 파라미터 얻음
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(mHolder); //프리뷰 디스플레이 담당한 서피스 홀더 설정
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(mCamera!=null){
Camera.Parameters parameters = mCamera.getParameters();
//프리뷰 사이즈 값 재조정
parameters.setPreviewSize(1280,720);
mCamera.setParameters(parameters);
//프리뷰 재시작
mCamera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mCamera!=null){
mCamera.stopPreview(); //프리뷰 멈춤
mCamera.setPreviewCallbackWithBuffer(null);
mCamera.release();
mCamera = null; //카메라 객체 초기화
}
}
private void beginRecording(){
Toast.makeText(getApplicationContext(), "진짜 시작", Toast.LENGTH_SHORT).show();
//파일 생성, 초기화
File videofile = new File(Path);
if(videofile.exists()){
videofile.delete();
}
Toast.makeText(getApplicationContext(), "파일생성초기화", Toast.LENGTH_SHORT).show();
/*
//레코더 객체 초기화
if(mRecoder!=null){
mRecoder.stop();
mRecoder.release();
mRecoder = null;
}
if(mCamera!=null){
mCamera.stopPreview(); //프리뷰 멈춤
mCamera.release();
mCamera = null; //카메라 객체 초기화
}
*/
try{
Toast.makeText(getApplicationContext(), "요기까진오는구나", Toast.LENGTH_SHORT).show();
mRecoder = new MediaRecorder();
//video, audio 소스 결정
mRecoder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecoder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecoder.setVideoFrameRate(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//녹화할 대상 파일 설정
mRecoder.setOutputFile(Path);
//mRecoder.setMaxDuration(RECORD_TIME); //녹화시간
Toast.makeText(getApplicationContext(), "프리뷰설정", Toast.LENGTH_SHORT).show();
//프리뷰 보여 줄 surface 설정
mRecoder.setPreviewDisplay(mHolder.getSurface()); /////요기가문제다!!!!!!!!!!
//녹화 준비, 시작
mRecoder.prepare();
Toast.makeText(getApplicationContext(), "녹화준비", Toast.LENGTH_SHORT).show();
mRecoder.start();
Toast.makeText(getApplicationContext(), "녹화시작", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
videoRecording 함수에 try끝나기 전에
mRecoder.setPreviewDisplay(mHolder.getSurface()); /////요기가문제다!!!!!!!!!!
이 부분에서 더이상 안넘어가고 에러가 뜨는거 같은데......
왜 안되는건지 도저히 모르겠네요 ㅠㅠㅠㅠ
그리고 제가 버튼없이 5분동안만 녹화를 할 거라서 MaxDuration사용해서 설정해 줄 건데, 이게 5분만 녹화하고 미디어레코드를 반환시켜주나요..?
mRecoder.stop();
mRecoder.release();
mRecoder = null;
따로 해줘야 되나요 이걸..? 그리고 또 궁금한게, 저렇게 해제하지 않으면 파일이 저장이 안되는건가요?
파일저장까지는 되는데 항상 용량이 0이네요... 아무래도 영상데이터 자체를 파일에 못넣는거 같아요...
혹시 도움될만한 사이트나 조언 부탁드립니다 ㅠ