我是Android编程的新手,因此我在进行研究项目时遇到了与视频相关的问题。在该项目中,我们希望构建一个应用程序,它既可以使用内置前置摄像头录制的视频,也可以使用内置加速度计检测到的加速度。
我的问题是这些视频的帧速率通常在15 fps到30 fps之间波动,即使我在相机源代码中将相机固定为30 fps。我试图关闭加速度计的数据流来测试帧速率的一致性。然而,它仍然波动。我在Note 3,Galaxy S4和S5中测试了这个问题。
以下代码是我在设备中设置前置摄像头的功能
private boolean prepareVideoRecorder(String filename, boolean isFrontCam){
mCamera = Camera.open;
mMediaRecorder = new MediaRecorder();
if(mCamera == null) return false;
Camera.Size size = getBestPreviewSize(1280, 720, mCamera.getParameters());
if(IS_TABLET){
mCamera.setDisplayOrientation(0);
}else{
mCamera.setDisplayOrientation(90);
}
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mMediaRecorder.setOutputFormat(profile.fileFormat);
mMediaRecorder.setVideoEncoder(profile.videoCodec);
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mMediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
// Step 4: Set output file
mMediaRecorder.setOutputFile(filename);
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
if(isFrontCam){
if(IS_TABLET){
mMediaRecorder.setOrientationHint(180);
}else{
mMediaRecorder.setOrientationHint(270);
}
}
else{
if(IS_TABLET){
mMediaRecorder.setOrientationHint(0);
}else{
mMediaRecorder.setOrientationHint(90);
}
}
mMediaRecorder.setVideoSize(size.width, size.height);
mMediaRecorder.setVideoFrameRate(30);
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
Toast.makeText(getBaseContext(), "IllegalStateException preparing MediaRecorder", Toast.LENGTH_SHORT).show();
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
Toast.makeText(getBaseContext(), "IOException preparing MediaRecorder", Toast.LENGTH_SHORT).show();
releaseMediaRecorder();
return false;
}
return true;
}
有人可以向我解释为什么在编写与相机相关的Android应用程序时,视频的帧速率会以这种方式波动吗?你可以建议我这个问题的解决方案吗?我也在其他网站上阅读过这个主题,但我不清楚也很难理解。
提前谢谢。
答案 0 :(得分:0)
我刚刚通过对Camera.Parameters使用setAutoExposureLock(true)和setAutoWhiteBalanceLock(true)解决了这个问题。经过一番搜索后,我发现帧率波动的原因与光线条件有关......所以摄像机的曝光控制也是如此。
我附上了我在下面使用的代码。
Camera.Parameters params = mCamera.getParameters();
params.setAutoExposureLock(true);
params.setAutoWhiteBalanceLock(true);
mCamera.setParameters(params);