使用MediaRecorder類、Camera開發基於Android系統手機的錄像功能
獲得的視頻文件十分模糊,無法達到系統再帶的相機所錄製的效果
經過分析后,發現在錄像的時候沒有使用自動聚焦功能,從而導致視頻效果極差
但是添加了自動對焦的代碼后,SurfaceView中的預覽已經達到預期效果,但是問題是錄製的視頻卻是花屏
已經糾結了好幾天了,希望Android開發的大牛能給予幫助
下面是代碼片段
public class MainActivity extends Activity implements OnClickListener {
private Button video_record, video_stop;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private MediaRecorder mediaRecorder;
private boolean isCard, isFocus, isRecord;
private String sdCard, recordPath, recordFormat = ".mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.activity_main);
init();
setListener();
}
private void init() {
video_record = (Button) findViewById(R.id.video_record);
video_stop = (Button) findViewById(R.id.video_stop);
surfaceView = (SurfaceView) findViewById(R.id.video_surface);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(new CustomCallBack());
video_stop.setEnabled(false);
isCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
isFocus = false;
isRecord = false;
if (isCard) {
sdCard = SDCardUtils.getExternalPath();
}
}
private void setListener() {
video_record.setOnClickListener(this);
video_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (!isCard) {
toast("SDCard is Invalid");
return;
}
switch (v.getId()) {
case R.id.video_record:
record();
break;
case R.id.video_stop:
stop();
break;
}
}
private void record() {
isRecord = true;
try {
initCamera();
initRecord();
} catch (IOException e) {
e.printStackTrace();
}
referenceView();
}
private void stop() {
isRecord = false;
freeRecordResource();
freeCameraResource();
referenceView();
}
private void referenceView() {
if (isRecord) {
video_record.setEnabled(false);
video_stop.setEnabled(true);
} else {
video_record.setEnabled(true);
video_stop.setEnabled(false);
recordPath = null;
}
}
private void initCamera() throws IOException {
if (camera != null) {
freeCameraResource();
}
try {
camera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
setCameraParams();
camera.setDisplayOrientation(90);
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
if (isFocus) {
camera.autoFocus(null);
}
camera.unlock();
}
private void initRecord() throws IOException {
if (mediaRecorder != null) {
freeRecordResource();
}
File file = createFile();
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setVideoSource(VideoSource.CAMERA);
mediaRecorder.setAudioSource(AudioSource.MIC);
mediaRecorder.setOutputFormat(OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);
// mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mediaRecorder.setVideoFrameRate(16);
mediaRecorder.setVideoEncodingBitRate(3000000);
// mediaRecorder.setOrientationHint(90);
mediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.prepare();
mediaRecorder.start();
}
private File createFile() throws IOException {
if (recordPath == null) {
recordPath = sdCard + File.separator + System.currentTimeMillis() + recordFormat;
}
File file = new File(recordPath);
if (!file.exists()) {
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
file.createNewFile();
}
return file;
}
private void freeCameraResource() {
if (camera != null) {
camera.setPreviewCallback(null);
camera.stopPreview();
camera.lock();
camera.release();
camera = null;
}
}
private void freeRecordResource() {
if (mediaRecorder != null) {