录制使预览和比率变暗

Recording darkens preview and ratios

这是用 NativeScript 编码的,所以我会尽力使场景适应 Java。我创建了一个支持录制视频的应用内视频视图。

这是按如下方式完成的:

首先,我创建一个 SurfaceView 来保存相机的预览:

this.mSurfaceView = new android.view.SurfaceView(this._context);
this.mHolder = this.mSurfaceView.getHolder(); 
this.mHolder.setType(android.view.SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

然后我创建一个Camera的实例,并设置视频表面:

var mCamera = android.hardware.Camera;
var camera = mCamera.open(1);   
this.camera = camera;
this.camera.setDisplayOrientation(90);
var parameters = camera.getParameters();
parameters.setRecordingHint(true);
if( parameters.isVideoStabilizationSupported() ){
    parameters.setVideoStabilization(true);
}
camera.setParameters(parameters);
this.camera.setPreviewDisplay(_this.mHolder);
this.camera.startPreview();
this.camera.startFaceDetection();         

现在,一切都很好。我在我想要的视图中有相机预览。颜色很好,我 认为 图像纵横比也很好。

但是,当我开始录制时,就像我使用以下代码所做的那样:

this.mediarecorder = new android.media.MediaRecorder();        
// Step 1: Unlock and set camera to MediaRecorder
this.camera.unlock();
this.mediarecorder.setCamera(this.camera);

// Step 2: Set sources
this.mediarecorder.setAudioSource(android.media.MediaRecorder.AudioSource.CAMCORDER);
this.mediarecorder.setVideoSource(android.media.MediaRecorder.VideoSource.CAMERA);
//this.mediarecorder.setOutputFormat(android.media.MediaRecorder.OutputFormat.MPEG_4);

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
this.mediarecorder.setProfile(android.media.CamcorderProfile.get(android.media.CamcorderProfile.QUALITY_HIGH));
// platform.screen.mainScreen.widthDIPs
// platform.screen.mainScreen.heightDIPs

// Step 4: Set output file
var fileName = "videoCapture_" + new Date() + ".mp4";
var path = android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Camera/" + fileName;
this.file = new java.io.File(path);
this.mediarecorder.setOutputFile(this.file.toString());

this.mediarecorder.setOrientationHint(270);

try {
    this.mediarecorder.prepare();
    this.mediarecorder.start();
} catch( ex ) {
    console.log(ex);
}

然后,图像突然变暗,我的脸(它是我尝试时对焦的部分)变宽了。所以纵横比发生了变化,照明也发生了变化。

我已经尝试在相机参数上设置 setPictureSize,在 MediaRecorder 上设置 setVideoSize,但没有成功。对于照明变化,我根本不知道发生了什么。现在我已经在谷歌上搜索了一半,但仍然一无所获,所以我希望这里有人知道下一步该做什么?

视频录制通常会尝试 运行 稳定的帧率,例如 30fps。相机预览通常会自行减慢到 10-15fps 以保持亮度,因此如果您在较暗的位置,视频录制会更暗(因为它不能曝光超过 1/30 秒而不是相机预览的 1/10 秒可以)。

你是在调用setProfile之前还是之后调用了setVideoSize? setProfile 调用会更改许多参数,包括预览大小;大多数视频录制尺寸为 16:9,默认相机预览分辨率可能为 4:3 尺寸。所以当你开始录制时,宽高比会切换。

大多数视频录制应用甚至在开始录制之前就使用 16:9 预览尺寸,以便它们保持一致。您也可以录制 4:3 视频,但这通常不是人们希望看到的。