package com.basic;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.VideoView;
public class VideoTest extends Activity implements SurfaceHolder.Callback {
@Override
protected void onPause() {
// on Pause 상태에서 카메라 ,레코더 객체를 정리한다
if (mCamera != null){
mCamera.release();
mCamera = null;
}
if (recorder != null){
recorder.stop();
recorder.release();
recorder = null;
}
super.onPause();
}
// Video View 객체
private VideoView mVideoView=null;
// 카메라 객체
private Camera mCamera;
// 레코더 객체 생성
private MediaRecorder recorder = null;
// 아웃풋 파일 경로
private static final String OUTPUT_FILE = "/sdcard/videooutput.mp4";
// 녹화 시간 - 10초
private static final int RECORDING_TIME = 10000;
// 카메라 프리뷰를 설정한다
private void setCameraPreview(SurfaceHolder holder){
try {
// 카메라 객체를 만든다
mCamera = Camera.open();
// 카메라 객체의 파라메터를 얻고 로테이션을 90도 꺽는다,옵Q의 경우 90회전을 필요로 한다 ,옵Q는 지원 안하는듯....
Camera.Parameters parameters = mCamera.getParameters();
parameters.setRotation(90);
mCamera.setParameters(parameters);
// 프리뷰 디스플레이를 담당한 서피스 홀더를 설정한다
mCamera.setPreviewDisplay(holder);
// 프리뷰 콜백을 설정한다 - 프레임 설정이 가능하다,
/* mCamera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
});
*/
} catch (Exception e) {
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 서피스가 만들어졌을 때의 대응 루틴
setCameraPreview(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 서피스 변경되었을 때의 대응 루틴
if (mCamera !=null){
Camera.Parameters parameters = mCamera.getParameters();
// 프리뷰 사이즈 값 재조정
parameters.setPreviewSize(width,height);
mCamera.setParameters(parameters);
// 프리뷰 다시 시작
mCamera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//서피스 소멸시의 대응 루틴
// 프리뷰를 멈춘다
if (mCamera != null){
mCamera.stopPreview();
// 카메라 객체 초기화
mCamera = null;
Intent intent = new Intent(this,ActivityTest.class);
startActivity(intent);
this.finish();
}
}
// 프리뷰(카메라가 찍고 있는 화상을 보여주는 화면) 설정 함수
private void setPreview()
{
// 1) 레이아웃의 videoView 를 멤버 변수에 매핑한다
mVideoView = (VideoView) findViewById(R.id.videoView);
// 2) surface holder 변수를 만들고 videoView로부터 인스턴스를 얻어온다
final SurfaceHolder holder = mVideoView.getHolder();
// 3)표면의 변화를 통지받을 콜백 객체를 등록한다
holder.addCallback(this);
// 4)Surface view 의 유형을 설정한다, 아래 타입은 버퍼가 없이도 화면을 표시할 때 사용된다.카메라 프리뷰는 별도의 버퍼가 필요없다
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private void setButtons()
{
// Rec Start 버튼 콜백 설정
Button recStart = (Button)findViewById(R.id.RecStart);
recStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("CAM TEST","REC START!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
if (mVideoView.getHolder() == null)
{
Log.e("CAM TEST","View Err!!!!!!!!!!!!!!!");
}
beginRecording(mVideoView.getHolder());
}
});
// Rec Stop 버튼 콜백 설정
Button recStop = (Button)findViewById(R.id.RecStop);
recStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 레코더 객체가 존재할 경우 이를 스톱시킨다
if ( recorder !=null){
Log.e("CAM TEST","CAMERA STOP!!!!!");
recorder.stop();
recorder.release();
recorder = null;
}
// 프리뷰가 없을 경우 다시 가동 시킨다
if ( mCamera == null ) {
Log.e("CAM TEST","Preview Restart!!!!!");
// 프리뷰 다시 설정
setCameraPreview(mVideoView.getHolder());
// 프리뷰 재시작
mCamera.startPreview();
}
}
});
}
private void beginRecording(SurfaceHolder holder) {
// 레코더 객체 초기화
Log.e("CAM TEST","#1 Begin REC!!!");
if(recorder!= null)
{
recorder.stop();
recorder.release();
}
String state = android.os.Environment.getExternalStorageState();
if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
Log.e("CAM TEST","I/O Exception");
}
// 파일 생성/초기화
Log.e("CAM TEST","#2 Create File!!!");
File outFile = new File(OUTPUT_FILE);
if (outFile.exists())
{
outFile.delete();
}
Log.e("CAM TEST","#3 Release Camera!!!");
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera=null;
Camera.Parameters parameters = mCamera.getParameters();
// 프리뷰 사이즈 값 재조정
parameters.setPreviewSize(800, 480);
mCamera.setParameters(parameters);
// 프리뷰 디스플레이를 담당한 서피스 홀더를 설정한다
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
// 프리뷰 콜백을 설정한다 - 프레임 설정이 가능하다,
Log.e("CAM TEST","#3 Release Camera _---> OK!!!");
}
try {
recorder = new MediaRecorder();
// Video/Audio 소스 설정
} catch(Exception e) {
Log.e("CAM TEST","1");
}
try {
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
} catch(Exception e) {
Log.e("CAM TEST","2");
}
try {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
} catch(Exception e) {
Log.e("CAM TEST","3");
}
try {
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
} catch(Exception e) {
Log.e("CAM TEST","4");
}
try {
// 비디오 사이즈를 수정하면 prepare 에러가 난다, 왜 그럴까? -> 특정 해상도가 있으며 이 해상도에만 맞출 수가 있다
recorder.setVideoSize(720, 480);
} catch(Exception e) {
Log.e("CAM TEST","5");
}
try {
recorder.setVideoFrameRate(25);
} catch(Exception e) {
Log.e("CAM TEST","6");
}
try {
// Video/Audio 인코더 설정
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
}catch(Exception e) {
Log.e("CAM TEST","7");
}
try {
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}catch(Exception e) {
Log.e("CAM TEST","8");
}
try{
// 녹화 시간 한계 , 10초
recorder.setMaxDuration(RECORDING_TIME);
}catch(Exception e) {
Log.e("CAM TEST","9");
}
try{
// 프리뷰를 보여줄 서피스 설정
recorder.setPreviewDisplay(holder.getSurface());
}catch(Exception e) {
Log.e("CAM TEST","10");
}
try {
// 녹화할 대상 파일 설정
recorder.setOutputFile(OUTPUT_FILE);
}catch(Exception e) {
Log.e("CAM TEST","11");
}
try {
recorder.prepare();
}catch(Exception e) {
Log.e("CAM TEST","12");
}
try {
recorder.start();
} catch (Exception e) {
Log.e("CAM TEST","13");
e.printStackTrace();
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.videotest);
// 세로화면 고정으로 처리한다
//SCREEN_ORIENTATION_LANDSCAPE // 가로화면 고정
//SCREEN_ORIENTATION_PORTRAIT // 세로화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 프리뷰를 설정한다
setPreview();
// 버튼을 설정한다
setButtons();
}
}
이게 소스이구요 동영상화면에서 start 버튼을 누르면 검은색화면으로 바껴버립니다.
그래서 촬영도 안되고 저장도 안되요...
오류를 잡으려고 log를 이용했는데 12번과 13번 부분에서 오류가 발생하네요(글씨 큰 부분이 로그 처리한 부분입니다.)
갤럭시s 로 실행시키니까 이런 현상이 발생하구요 모토글램에서는 실행이 되더라구요
도와주세요