我正在将照片/视频捕获集成到我的应用中,并且遇到了视频捕获问题。无论何时录像开始,屏幕闪烁,我会暂停一段时间,然后开始录像。但是,使用手机的相机应用程序,根本没有闪烁/暂停。开始录制视频时屏幕闪烁并调整大小
而且,我的相机预览显示会在调用recorder.start()
后立即调整大小。我不明白这是为什么。它会使预览失真(一切看起来都会变得更加宽广)。
我的问题:如何防止开始录像时的闪烁/暂停?如何防止recorder.start()
调整我的预览显示?
每当启用“视频模式”时,立即调用initRecording()
。一旦用户按下按钮,startRecording()
被调用。最后,当再次按下按钮时,调用stopRecording()
。不太重要的是,当切换回“图片模式”时,destroyRecorder()
被调用。
@Override
public void onResume() {
super.onResume();
Camera camera = null;
try {
camera = Camera.open();
}
catch (Exception e) {
// Camera isn't available
Toast.makeText(getActivity(), "Camera is not available at this time.", Toast.LENGTH_SHORT).show();
getActivity().finish();
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
setCameraDisplayOrientation(camera);
}
else {
camera.setDisplayOrientation(90);
}
setCamera(camera);
setCameraZoomDisplay(camera);
if (getSurfaceHolder() != null) {
startPreview();
if (getMode() == MODE_VIDEO) {
initRecording();
}
}
}
private void setCameraDisplayOrientation(Camera camera) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(0, info);
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result = (info.orientation - degrees + 360) % 360;
camera.setDisplayOrientation(result);
}
private void initRecording() {
MediaRecorder recorder = new MediaRecorder();
setRecorder(recorder);
Camera camera = getCamera();
camera.unlock();
recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile cp = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cp);
String extension;
switch (cp.fileFormat) {
case MediaRecorder.OutputFormat.MPEG_4:
extension = "mp4";
break;
case MediaRecorder.OutputFormat.THREE_GPP:
extension = "3gp";
break;
default:
extension = "tmp";
}
setVideoMimeType(MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension));
File toFile = new File(getActivity().getCacheDir(), "tempvideo.tmp");
if (toFile.exists()) {
toFile.delete();
}
setTempFile(toFile);
recorder.setOutputFile(toFile.getPath());
recorder.setPreviewDisplay(getSurfaceHolder().getSurface());
try {
recorder.prepare();
setRecorderInitialized(true);
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
private boolean startRecording() {
try {
getRecorder().start();
setRecording(true);
ImageView actionImageView = getActionImageView();
actionImageView.setImageResource(R.drawable.record_red);
}
catch (Exception e) {
getCamera().lock();
}
return true;
}
private void stopRecording() {
MediaRecorder recorder = getRecorder();
if (recorder != null && isRecording()) {
recorder.stop();
setRecording(false);
setRecorderInitialized(false);
try {
insertVideo();
}
catch (IOException e) {
e.printStackTrace();
}
initRecording();
ImageView actionImageView = getActionImageView();
actionImageView.setImageResource(R.drawable.record_green);
}
}
private void destroyRecorder() {
MediaRecorder recorder = getRecorder();
recorder.release();
setRecorder(null);
getCamera().lock();
}
你有没有想过是什么导致闪烁和调整大小?我正在处理与我正在进行的项目相同的问题。 – MattDavis
@MattDavis抱歉,遗憾的是没有。 –