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

안드로이드 앱개발 동영상촬영시 영상해상도가 떨어집니다.

0 추천

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class Record extends Activity implements SurfaceHolder.Callback,
Handler.Callback {
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private LayoutInflater controlInflater = null;
private ImageButton showlocation, mode, exit;
private SharedPreferences prefs;

----중간생략----

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.surfaceview);

getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);




controlInflater = LayoutInflater.from(getBaseContext());
View viewControl = controlInflater.inflate(R.layout.surfacecontrol,
null);
LayoutParams layoutParamsControl = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
this.addContentView(viewControl, layoutParamsControl);

---중간생략----

protected void startMediaRecorder() {
if (recorder != null) {
recorder.start();
}
}

protected void stopMediaRecorder() {
if (recorder != null) {
recorder.stop();
}

c = Calendar.getInstance();
endHour = c.get(Calendar.HOUR_OF_DAY);
endMinute = c.get(Calendar.MINUTE);
endSecond = c.get(Calendar.SECOND);
filename = filename + " ~ " + endHour + "h " + endMinute + "m "
+ endSecond + "s.mp4";

try {
FileWriter ops = new FileWriter(logfile, true);
BufferedWriter bw = new BufferedWriter(ops);
String temp = startYear + "-" + startMonth + "-" + startDay + " "
+ endHour + "h " + endMinute + "m " + endSecond
+ "s 녹화 종료 !!";
bw.newLine();
bw.write(temp);

bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
}

if(is_save) {
//이벤트 미발생영상 저장시
save.renameTo(new File(subdirectory, filename));
} else {
//이벤트 미발생영상 미저장시
if(is_save_event_on) {
//이벤트가 발생한것만 저장
save.renameTo(new File(subdirectory, filename));
} else {
//미발생 영상 삭제
save.delete();
}
}

}

protected void releaseMediaRecorder() {
if (recorder == null)
return;
recorder.reset();
recorder.release();
recorder = null;
}

protected void startIntervalRecording() {
mTimer = new CountDownTimer(sequence, 1000) {
boolean recordStart = false;

@Override
public void onFinish() {
if (recordStart) {
mHandler.sendEmptyMessage(STOP_RECORDING);
mHandler.sendEmptyMessage(RELEASE_RECORDER);
mHandler.sendEmptyMessage(INIT_RECORDER);
mHandler.sendEmptyMessage(START_INTERVAL_RECORD);
}
}

protected void initMediaRecorder() {

// 레코더 초기화
recorder = new MediaRecorder();

// 비디오 포맷 지정 - 오디오 녹음 셋팅
if (is_audio)
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// camera.autoFocus(new AutoFocusCallback());
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(16);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
if (is_audio)
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

// 저장경로 지정
try {
temp = File.createTempFile("temp", ".mp4", subdirectory);
} catch (IOException e1) {
// TODO Auto-generated catch block
}
temp.deleteOnExit();
setFilename();
save = new File(subdirectory, "tempfile");
temp.renameTo(save);
is_save_event_on = false;
recorder.setOutputFile(save.getAbsolutePath());
recorder.setPreviewDisplay(surfaceHolder.getSurface());

try {
recorder.prepare();
} catch (Exception e) {
releaseMediaRecorder();
return;
}
}

public void surfaceCreated(SurfaceHolder holder) {
//surfaceCreated(holder);
surfaceHolder = holder;
initMediaRecorder();
startIntervalRecording();
ACC_Sensor = new Sensor_ACCELEROMETER();
new Sensor_MAGNETIC_FIELD();

loadGps();

}

public void surfaceDestroyed(SurfaceHolder holder) {
surfaceHolder = null;
try {
// 녹화 정지
mHandler.sendEmptyMessage(STOP_RECORDING);
mHandler.sendEmptyMessage(RELEASE_RECORDER);

if (mysensormanager_acc != null) {
mysensormanager_acc.unregisterListener(ACC_Sensor);
}
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}

} catch (Exception e) {
}
}

앱을 하나 제작중인데 동영상을 촬영합니다. 하지만 문제는 화면의 화소가 떨어지는 현상이 발생됩니다. 

surface view 문제이거나 preview인것 같은데.... 해결방법을 잘 모르겠습니다.

펍분들의 의견을 받고싶습니다

 

위와 보시는것과 같이 촬영을 시작했을때 구분을 못할정도로 해상도가 떨어집니다. 

 

코드의 일부를 첨부합니다. 도움을 주시면 감사하겠습니다. 영상공부를 하시는 분들의 의견도 감사히 받겠습니다. 

현재 보시는 이미지는 저장한 영상을 재생하는 부분입니다. 
 
영상을 촬영할때도 이와같은 저급한 화질을 보여주고는 합니다. 
 
도움을 주시면 감사하겠습니다. ㅠㅠ 
익명사용자 님이 2013년 10월 10일 질문
2013년 10월 10일 수정

1개의 답변

0 추천
getSupportedPreviewSizes

로받아와서 setvideosize 적당한걸로 마추식시고 

프레임레이트도 더 올려서 해보세여... 단.. 파일용량은 장담못해드림

건방진프로그래머 (26,630 포인트) 님이 2013년 10월 10일 답변
해결되지 않았습니다. ㅜ.ㅜ
...